繁体   English   中英

GLSL 片段着色器中的 texture3DLod

[英]texture3DLod in GLSL fragment shader

我在 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM