glUniform无法设置采样器值

fes*_*crb 5 c c++ opengl textures glsl

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑

这是着色器:

uniform sampler2D texture;

varying vec2 textureCoord;

void main() {
    gl_FragColor = texture2D(texture, textureCoord);
}
Run Code Online (Sandbox Code Playgroud)

一些工作后我设法解决了这个问题.

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

纹理返回(0,0,0,1)的问题总是由于我在纹理生成过程中犯的错误.

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

Tim*_*Tim 3

解决方案

经过一番工作后我设法解决了这个问题。

事实证明,这个问题并不是由于未设置统一造成的,因为无论实际值如何,采样器总是返回 0 似乎是 gl 实现的一个怪癖。仅在 Intel 的 Sandy Bridge 驱动程序下发生这种情况。在其他实现下测试代码总是返回正确的采样器值。

纹理返回 (0, 0, 0, 1) 的问题始终是由于我在纹理生成过程中犯的错误造成的。

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