Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么texelFetch对于1D单通道纹理总是返回0?_C++_Opengl_Textures_Glsl - Fatal编程技术网

C++ 为什么texelFetch对于1D单通道纹理总是返回0?

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); {

我使用1D纹理来存储需要片段着色器访问的单通道整数数据。来自应用程序的整数数据类型为GLubyte,需要在着色器中作为无符号整数进行访问。下面是如何创建纹理的注意,后面还有其他纹理单元被绑定,我希望它们与问题无关:

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);
}