3 c++ opengl shader glsl fragment-shader
目前,我阅读具有以下功能的3D纹理texture(...) :
vec3 value = texture(texture_3D, coord).rgb
我现在想做的是:
vec3 value = texelFetch(texture_3D, coord, 0).xyz
但是,我不知道如何转换坐标以使其与texelFetch一起使用。我的质地够大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)
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?如果您需要更多信息,请询问,我会提供。
这两个函数在完全不同的参数上执行完全不同的任务。
texture期望归一化的浮点纹理坐标为[0,1](即0为左/下,而1为右/上)并执行适当的换行(因此,坐标不必一定在[0,1]中)并进行过滤(因此您不一定获得确切的纹理颜色),取决于您设置的任何采样模式。
texelFetch另一方面,期望整数texel索引为[0,width-1](分别为y和z的高度/深度),并且不执行任何类型的过滤或换行操作,而是访问a中指定索引处的确切texel值指定的mipmap级别。
因此texelFetch(texture_3D, ivec3(coord * vec3(256.0), 0)应该等同于texture(texture_3D, coord) 具有过滤器模式GL_NEAREST和包装模式GL_CLAMP_TO_EDGE。但是,也要记住,如果坐标正好1.0在texel边界上或在texel边界上,可能texelFetch(texture_3D, ivec3(coord * vec3(255.0) + vec3(0.5), 0)会出现舍入问题,因此在这方面可能更安全一些。
但是,与仅使用GL_NEAREST过滤器保持当前纹理访问相比,仅以这种方式进行更改似乎是一个无用的方法。如果您已经具有整数的纹理像素坐标并且已经知道纹理大小,则它会更有用。仅用这种方式模拟最近的过滤并不会真正给您带来任何好处。从本质上讲,这是两种在概念上不同的方法,一种方法使用大小无关的浮点坐标过滤纹理,另一种方法使用整数索引访问3D数组。这取决于您的周围代码,哪种方法更适合您的用例。
| 归档时间: |
|
| 查看次数: |
1814 次 |
| 最近记录: |