我正在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级采样获得值。
您可能会缺少这两个非常重要的参数:
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);