glUniform无法设置采样器值

glUniform fails to set sampler value

本文关键字:采样器 设置 glUniform      更新时间:2023-10-16

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

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

glUseProgram(programObject);
glUniform1i(glGetUniformLocation(programObject, "texture"), 1);
GLint val;
glGetUniformiv(programObject, 
               glGetUniformLocation(programObject, "texture"), 
               &val);
printf("Value is %dn", val);

在命令行输出处打印的值为0。我已检查着色器是否已正确编译,程序是否已正确链接。CCD_ 2输出索引>0。此外,glGetError在任何时刻都不输出任何错误。

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

我对这个问题进行了广泛的搜索,在这里只发现了一个类似的例子。解决方案是初始化GLEW,但这对我来说不起作用

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

编辑

这是着色器:

uniform sampler2D texture;
varying vec2 textureCoord;
void main() {
    gl_FragColor = texture2D(texture, textureCoord);
}

解决方案

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

事实证明,这个问题并不是因为没有设置uniform,因为无论实际值如何,总是为采样器返回0似乎是gl实现的一个怪癖。这只发生在英特尔的SandyBridge驱动程序下。在其他实现下测试代码总是返回正确的采样器值。

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

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

解决方案

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

事实证明,这个问题并不是因为没有设置uniform,因为无论实际值如何,总是为采样器返回0似乎是gl实现的一个怪癖。这只发生在英特尔的SandyBridge驱动程序下。在其他实现下测试代码总是返回正确的采样器值。

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

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