2014-10-01 49 views
0

從着色器獲取制服時出現問題。該行:OpenGl GLSL uniform set返回錯誤

int u = GL20.glGetUniformLocation(program, uniform); 

用於檢查字符串uniform定義的統一是否在着色器中。

下面是一個例子校驗碼:

System.out.println(GL20.glGetUniformLocation(1, "transformationMatrix")==0); 
System.out.println(GL20.glGetUniformLocation(1, "projectionMatrix")==0); 

而結果:

false 
true 

它來了奇怪的事情:頂點着色器的代碼如下:

#version 330 

layout (location = 0) in vec3 pos; 
layout (location = 1) in vec3 tex; 
layout (location = 2) in vec3 nor; 
layout (location = 3) in vec3 col; 

uniform mat4 projectionMatrix; 
uniform mat4 transformationMatrix; 

out vec3 normal; 

void main(){ 

    normal = nor; 
    gl_Position = projectionMatrix * vec4(pos, 1); 
} 

我已經測試過重命名制服,刪除另一個,但唯一一個統一的OpenGL似乎recog nize是「投影矩陣」之一。

環境: 與Java與檯面10.4.0 Linux的LWJGL 的OpenGl

回答

4

的GLSL編譯器允許從發出執行着色器剝離未使用的變量(不能在Windows工作,要麼),作爲優化(使用更少的寄存器等)。 如果使用transformationMatrix uniform來計算着色器的返回值,則會將其保存在着色器中,並且錯誤將消失。

這不是一個「硬」的錯誤,隨意忽略它。您可能會遇到它,尤其是當您爲了調試目的而更改GLSL代碼時。

3

glGetUniformLocation()如果沒有找到制服,則返回-1。從man page

如果名稱不對應於程序中活動的統一變量,或者名稱以保留前綴「gl_」開頭,則此函數返回-1。

所以錯誤的測試必須是:

System.out.println(GL20.glGetUniformLocation(1, "transformationMatrix") == -1); 
System.out.println(GL20.glGetUniformLocation(1, "projectionMatrix") == -1); 

作爲另一個答案的建議,這是事實,當着色器編譯未使用的制服可以消除/鏈接。但這不是你在這種情況下觀察到的。 0是一個有效的統一位置。