glUniform无法设置采样器值

时间:2012-02-21 14:32:14

标签: c++ c opengl glsl textures

我正在使用OpenGL和GLSL在简单网格上绘制纹理。

我的问题是,当我使用glUniform1i设置sampler2D统一的值时,它没有设置。例如,在此代码中:

glUseProgram(programObject);

glUniform1i(glGetUniformLocation(programObject, "texture"), 1);
GLint val;
glGetUniformiv(programObject, 
               glGetUniformLocation(programObject, "texture"), 
               &val);
printf("Value is %d\n", val);

在命令行输出的值为0.我已检查着色器是否正确编译并且程序是否正确链接。 glGetUniformLocation输出索引> 0.此外,glGetError在任何时候都不会输出任何错误。

只有当制服是采样器时才会发生这种情况。由于未设置纹理,因此在着色器中查询它始终返回(0,0,0,1)。 (我还使用apitrace检查了我的纹理是否正确绑定到GL_TEXTURE1,这在显示的代码之后立即完成。

我已经广泛搜索了这个问题,我只发现了一个与此here类似的实例。解决方案是初始化GLEW,但这对我没用。

我很乐意提供所需的任何扩展信息(或来自apitrace的跟踪)。

修改

以下是着色器:

uniform sampler2D texture;

varying vec2 textureCoord;

void main() {
    gl_FragColor = texture2D(texture, textureCoord);
}

解决方案

经过一番努力,我设法解决了这个问题。

事实证明,这个问题不是由于统一没有被设置,因为不管实际值如何,总是为采样器返回0似乎是gl实现的怪癖。这只发生在Intel的Sandy Bridge驱动程序之下。在其他实现下测试代码总是返回正确的采样器值。

纹理返回(0,0,0,1)的问题总是由于我在生成纹理时犯了一个错误。

现在glGerUniformiv仍然返回0,但使用的纹理是正确的。

1 个答案:

答案 0 :(得分:3)

<强>解决方案

经过一番努力,我设法解决了这个问题。

事实证明,这个问题不是由于统一没有被设置,因为不管实际值如何,总是为采样器返回0似乎是gl实现的怪癖。这只发生在Intel的Sandy Bridge驱动程序之下。在其他实现下测试代码总是返回正确的采样器值。

纹理返回(0,0,0,1)的问题总是由于我在生成纹理时犯了一个错误。

现在glGerUniformiv仍然返回0,但使用的纹理是正确的。