代码之家  ›  专栏  ›  技术社区  ›  user4911648

从texture()切换到texelFetch()

  •  5
  • user4911648  · 技术社区  · 8 年前

    目前,我使用该功能读取3D纹理 texture(...) 这样地:

    vec3 value = texture(texture_3D, coord).rgb

    我现在想做的是:

    vec3 value = texelFetch(texture_3D, coord, 0).xyz

    256x256x256

    我当前的坐标计算如下:

    vec3 min_box = vec3(-0.5);
    vec3 max_box = vec3(0.5);
    
    vec3 coord = worldToVolume(world_pos, min_box, max_box)
    
    vec3 worldToVolume(world_pos, min_box, max_box) {
         return (world_pos - min_box) / (max_box - min_box)
    }
    

    有什么想法吗?如果你需要更多信息,请询问,我会提供。

    2 回复  |  直到 8 年前
        1
  •  9
  •   Christian Rau    8 年前

    texture 期望 [0,1]中的归一化浮点纹理坐标

    texelFetch [0,width-1]中的整数texel索引 (分别为y和z的高度/深度),不执行任何类型的过滤或包装,在指定的mipmap级别访问指定索引处的精确纹理值。

    texelFetch(texture_3D, ivec3(coord * vec3(256.0), 0) 应等于 texture(texture_3D, coord) 具有 过滤器模式 GL_NEAREST 和包装模式 GL_CLAMP_TO_EDGE 但是,也要记住,如果坐标正好是 1.0 texelFetch(texture_3D, ivec3(coord * vec3(255.0) + vec3(0.5), 0) 在这方面更安全可能是明智的。

    GL_最近 滤器如果您已经有整数纹理坐标,并且已经知道纹理大小,那么它会更有用。仅以这种方式模拟最近的过滤并不能真正为您带来任何好处。这基本上是两种概念上不同的方法,一种使用大小无关的浮点坐标过滤纹理,另一种使用整数索引访问3D数组。这取决于您周围的代码,哪种方法更适合您的用例。

        2
  •  3
  •   BDL Vyxzl    8 年前

    之后 worldToVolume 你的坐标似乎在[0,1]范围内。自从 texelFetch

    vec3 coord = worldToVolume(world_pos, min_box, max_box);
    ivec3 texel_fetch_coord = ivec3(coord * vec3(256, 256, 256));
    

    请注意,您可以使用 textureSize 方法