C++ 为什么texelFetch对于1D单通道纹理总是返回0?
我使用1D纹理来存储需要片段着色器访问的单通道整数数据。来自应用程序的整数数据类型为GLubyte,需要在着色器中作为无符号整数进行访问。下面是如何创建纹理的注意,后面还有其他纹理单元被绑定,我希望它们与问题无关:C++ 为什么texelFetch对于1D单通道纹理总是返回0?,c++,opengl,textures,glsl,C++,Opengl,Textures,Glsl,我使用1D纹理来存储需要片段着色器访问的单通道整数数据。来自应用程序的整数数据类型为GLubyte,需要在着色器中作为无符号整数进行访问。下面是如何创建纹理的注意,后面还有其他纹理单元被绑定,我希望它们与问题无关: GLuint mTexture[2]; std::vector<GLubyte> data; ///... populate with 289 elements, all with value of 1 glActiveTexture(GL_TEXTURE0); {
GLuint mTexture[2];
std::vector<GLubyte> data;
///... populate with 289 elements, all with value of 1
glActiveTexture(GL_TEXTURE0);
{
glGenTextures(1, &mTexture[0]);
glBindTexture(GL_TEXTURE_1D, mTexture[0]);
{
glTexImage1D(GL_TEXTURE_1D, 0, GL_R8UI, data.size(), 0,
GL_RED_INTEGER, GL_UNSIGNED_BYTE, &data[0]);
}
glBindTexture(GL_TEXTURE_1D, 0);
}
glActiveTexture(GL_TEXTURE1);
{
//Setup the other texture using mTexture[1]
}
在本例中,从texelFetch返回的值基本上决定了从2D数组中使用哪个纹理层作为最终输出颜色。我希望它返回值1,但它总是返回0并点击片段着色器中的else子句。使用NVIDIA的Nsight工具,我可以看到纹理确实包含1289次的值:在使用之前,您正在解除绑定纹理:glBindTextureGL_texture_1D,0;我认为你还必须将纹理的最小过滤器和最大过滤器设置为最接近的GL_。@jozxyqk解除绑定是正确的,现在我意识到这是怎么回事了,这太愚蠢了。我还需要设置glTexParameteriGL_TEXTURE_1D,GL_TEXTURE_MAX_LEVEL,0;让它工作。纹理过滤模式可以保留为默认模式。
#version 420 core
smooth in vec2 tc;
out vec4 color;
layout (binding = 0) uniform usampler1D buffer;
layout (binding = 1) uniform sampler2DArray sampler;
uniform float spacing;
void main()
{
vec3 pos;
pos.x = tc.x;
pos.y = tc.y;
if (texelFetch(buffer, 0, 0).r == 1)
pos.z = 3.0;
else
pos.z = 0.0;
color = texture(sampler, pos);
}