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,但使用的纹理是正确的.
解决方案
经过一番工作后我设法解决了这个问题。
事实证明,这个问题并不是由于未设置统一造成的,因为无论实际值如何,采样器总是返回 0 似乎是 gl 实现的一个怪癖。仅在 Intel 的 Sandy Bridge 驱动程序下发生这种情况。在其他实现下测试代码总是返回正确的采样器值。
纹理返回 (0, 0, 0, 1) 的问题始终是由于我在纹理生成过程中犯的错误造成的。
现在 glGerUniformiv 仍然返回 0,但使用的纹理是正确的。