我正在使用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