2013-12-10 17 views
3

我有以下着色器: 我的片段着色器:統一無效

#version 110 
uniform mat4 modelMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 projectionMatrix; 


void main() { 
    gl_FragColor = vec4(1, 0, 0, 1); 
} 

我的頂點着色器:

#version 110 

uniform mat4 modelMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 projectionMatrix; 

attribute vec3 vertex; 

void main() { 
    vec4 world = modelMatrix * vec4(vertex, 1); 
    vec4 camera = world * viewMatrix; 
    gl_Position = projectionMatrix * world; 
} 

他們編譯和鏈接就好了。當我打印出我的活動制服時,我得到

projectionMatrix 
modelMatrix 

但沒有viewMatrix。當我嘗試使用glGetUniformLocation來獲得統一格式時,我可以得到projectionMatrix,modelMatrix和我的頂點屬性,所以viewMatrix爲什麼是非活動的?

回答

6

問題就出在你的頂點着色器的最後一行:

gl_Position = projectionMatrix * world; 

你大概就是這個意思projectionMatrix * camera。否則,GLSL編譯器會看到camera未被使用並優化它,這意味着viewMatrix不再被使用。未使用的制服不被認爲是積極的,這會導致你的困境。

注意:您的查看變換也向後。您可能需要vec4 camera = viewMatrix * world

+0

感謝您的快速回復! – Vastsuperking

+0

謝謝關於我的視圖變換正在倒退的通知,我忘記了矩陣乘法不是可交換的 – Vastsuperking

+1

'glPosition = projectionMatrix * camera'將等價於'glPosition = projectionMatrix * viewMatrix * modelMatrix * vec4(vertex,1)',是你正在計算的東西。請注意,雖然組合矩陣通常被稱爲MV,MVP等,但乘法的實際順序是「P * V * M」。 – bcrist