我正在使用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,但使用的纹理是正确的。
答案 0 :(得分:3)
<强>解决方案强>
经过一番努力,我设法解决了这个问题。
事实证明,这个问题不是由于统一没有被设置,因为不管实际值如何,总是为采样器返回0似乎是gl实现的怪癖。这只发生在Intel的Sandy Bridge驱动程序之下。在其他实现下测试代码总是返回正确的采样器值。
纹理返回(0,0,0,1)的问题总是由于我在生成纹理时犯了一个错误。
现在glGerUniformiv仍然返回0,但使用的纹理是正确的。