GLSL片段着色器中的text3DLod

问题描述 投票:0回答:1

我正在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级采样获得值。

opengl glsl shader fragment-shader texture-mapping
1个回答
0
投票

您可能会缺少这两个非常重要的参数:

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
© www.soinside.com 2019 - 2024. All rights reserved.