我正在使用OpenGL和GLSL在简单的网格上绘制纹理。glUniform无法设置采样器值
我的问题是,当我使用glUniform1i
来设置sampler2D uniform的值时,它没有设置。例如,在在此代码:
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实现的一个怪癖。这只发生在英特尔Sandy Bridge的驱动程序下。在其他实现下测试代码总是返回正确的采样器值。
纹理返回(0,0,0,1)的问题总是由于我在纹理生成过程中犯的一个错误。
现在glGerUniformiv
仍然返回0,但使用的纹理是正确的。
您还应该发布着色器。 – 2012-02-21 14:34:58
您是否试过将其命名为别的东西(纹理也是内置的GLSL函数,而技术上不是一个关键字,我不能保证这会起作用)。 – KillianDS 2012-02-21 15:10:30
我试着将制服重命名为“myTexture”,但结果是相同的,不幸的是。 – fescrb 2012-02-21 15:22:47