Opengl 在片段着色器中采样GL_纹理_3D

Opengl 在片段着色器中采样GL_纹理_3D,opengl,textures,glsl,fragment-shader,compute-shader,Opengl,Textures,Glsl,Fragment Shader,Compute Shader,我有一个大小为16x16x6的GL_纹理_3D,它在计算着色器中填充了浮点数,我正在尝试在片段着色器中对其进行采样 要使其可用于片段着色器,我在draw调用之前有以下代码: //Set the active texture and bind it glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_3D, textureID); //Add the sampler uniform glUniform1i(glGetUniformLoca

我有一个大小为16x16x6的GL_纹理_3D,它在计算着色器中填充了浮点数,我正在尝试在片段着色器中对其进行采样

要使其可用于片段着色器,我在draw调用之前有以下代码:

//Set the active texture and bind it
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, textureID);

//Add the sampler uniform
glUniform1i(glGetUniformLocation(textureID, "TextureSampler"), 0);
然后在片段着色器本身中:

uniform sampler3D TextureSampler;
然后,要测试纹理是否正确通过,请执行以下操作:

vec4 test = texture(TextureSampler, ivec3(0,0,0));

color = vec4(1.0,0.0,0.0,1.0) * test.x; //or test.y, test.z, test.w
基于此,看起来每个texel值都是
(0.0,0.0,0.0,1.0)

我不明白为什么会这样?我希望在coords
(0,0,0)
中,根据我在计算着色器中设置的值,值可以是
(16.0,0.0,0.0,0.0)
(16.0,16.0,16.0,16.0)


另外,可能值得注意的是,这些值正在正确写入纹理。我使用
glGetTexImage()

在计算和片段着色器调用之间进行检查,确保填充mipmap级别或禁用它们。您可能正在写入主级别,但忽略mipmap级别,然后碎片着色器对其进行采样。GL_纹理的第三维也是mipmap级别吗?是的,三维纹理与普通纹理一样具有mipmap。例如,大小为
(x,y,z)
的3D纹理具有大小为
(x/2,y/2,z/2)
(x/4,y/4,z/4)
等的mipmap级别。如果不希望在Z轴上进行mipmap,请改用数组纹理。请稍候,使3D纹理具有
(x,y,Z)
坐标和mipmap级别?那么第三维度不是mipmap级别?如果是这种情况,为什么mipmapping的状态会影响我对给定
(x,y,z)
坐标的采样能力三维纹理的工作原理与二维纹理非常相似,只有数据是三维的。不是传递2D纹理坐标,而是传递3D纹理坐标。标准化坐标和mipmapping仍然适用于3D纹理。如果要自己指定mipmap级别,请使用
textureLod
。如果要直接访问纹理,请使用
texelFetch