【发布时间】:2017-04-12 11:07:57
【问题描述】:
我在 glsl 片段着色器中使用 texture3DLod 从 3D 纹理的任意 mipmap 级别进行采样,但我获得的样本始终来自基本级别 (0)。怎么了?
这些变量定义了我在 CPU 内存中的 3D 纹理:
// Dimensions of the 3D texture
GLsizei dim[3]
// Pointer to texture buffer
GLvoid * voxels;
这是我用来设置 3D 纹理和生成 mipmap 的 OpenGL 代码:
GLuint texId = 0;
glEnable( GL_TEXTURE_3D );
glGenTextures( 1, &texId );
glBindTexture( GL_TEXTURE_3D, texId );
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexImage3D( GL_TEXTURE_3D, 0, GL_LUMINANCE, dim[0], dim[1], dim[2], 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, voxels );
glGenerateMipmap(GL_TEXTURE_3D);
在片段着色器中,我们有:
#version 120
#extension GL_ARB_shader_texture_lod : require
uniform sampler3D volume;
variying vec3 position;
void main()
{
gl_FragColor = texture3DLod( volume, position, 3.0 );
}
不管texture3DLod函数的最后一个参数使用什么值,我都是从3D纹理的0级采样得到的值。
【问题讨论】:
-
"我获得了从 3D 纹理的 0 级采样的值。"你怎么知道的?
-
无论我为LOD参数使用什么值,屏幕上的渲染图像都保持不变。
标签: opengl glsl shader fragment-shader texture-mapping