2012-02-21 53 views
5

我正在使用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,但使用的纹理是正确的。

+0

您还应该发布着色器。 – 2012-02-21 14:34:58

+2

您是否试过将其命名为别的东西(纹理也是内置的GLSL函数,而技术上不是一个关键字,我不能保证这会起作用)。 – KillianDS 2012-02-21 15:10:30

+0

我试着将制服重命名为“myTexture”,但结果是相同的,不幸的是。 – fescrb 2012-02-21 15:22:47

回答

3

解决方案

我管理后的一些工作来解决这个问题。

事实证明,这个问题并不是由于未设置统一函数而导致的,因为对于采样器总是返回0,而不管实际值如何,似乎是gl实现的一个怪癖。这只发生在英特尔Sandy Bridge的驱动程序下。在其他实现下测试代码总是返回正确的采样器值。

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

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