2012-02-21 25 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,但使用的紋理是正確的。