2012-01-09 169 views
0

我有類似的代碼作爲這樣一個問題: some opengl and glm explanationGLM矩陣乘法和OpenGL GLSL

我有通過作爲單個統一

//C++ 
mat4 combinedMatrix = projection * view * model; 

//GLSL doesn't work 
out_position = combinedMatrix * vec4(vertex, 1.0); 

它不工作的組合的矩陣。但如果我在着色器中進行所有乘法,所以我通過每個矩陣並得到

//GLSL works 
out_position = projection * view * model * vec4(vertex, 1.0); 

它的工作原理。 我看不出我的矩陣在C++代碼中有什麼問題。

下工作太

//C++ 
mat4 combinedMatrix = projection * view * model; 
vec4 p = combinedMatrix * v; 
//pass in vertex p as a vec4 

//GLSL works 
out_position = vertex 
+1

你已經發布的代碼看起來是正確的?你確定這個問題不在其他地方嗎?就像你使用的是錯誤的統一位置或什麼東西? – 2012-01-09 19:26:01

+1

我看不到任何錯誤信息 – CodeMonkey 2012-01-09 20:33:11

+2

Matthew非常感謝你!!!我是個白癡!因爲這個示例代碼是錯誤的,我必須調用glUniforms來更新我的數據,所有這些我都會像處理Vertex Arrays(在init代碼中設置em一樣)來處理它們,但是當我轉換它們時,我的矩陣需要更新。 – CodeMonkey 2012-01-09 20:51:17

回答

0

我想問題可能是你在你的代碼做矩陣乘法。

下面的乘法是如何執行的?

MAT4 combinedMatrix =投影*視*模型

在我看來很奇怪,矩陣乘法不能以這種方式,除非我是完全錯誤的完成。

這是我執行的方式:

for (i=0; i<4; i++) { 
    tmp.m[i][0] = (srcA->m[i][0] * srcB->m[0][0]) + 
        (srcA->m[i][1] * srcB->m[1][0]) + 
        (srcA->m[i][2] * srcB->m[2][0]) + 
        (srcA->m[i][3] * srcB->m[3][0]) ; 

    tmp.m[i][1] = (srcA->m[i][0] * srcB->m[0][1]) + 
        (srcA->m[i][1] * srcB->m[1][1]) + 
        (srcA->m[i][2] * srcB->m[2][1]) + 
        (srcA->m[i][3] * srcB->m[3][1]) ; 

    tmp.m[i][2] = (srcA->m[i][0] * srcB->m[0][2]) + 
        (srcA->m[i][1] * srcB->m[1][2]) + 
        (srcA->m[i][2] * srcB->m[2][2]) + 
        (srcA->m[i][3] * srcB->m[3][2]) ; 

    tmp.m[i][3] = (srcA->m[i][0] * srcB->m[0][3]) + 
        (srcA->m[i][1] * srcB->m[1][3]) + 
        (srcA->m[i][2] * srcB->m[2][3]) + 
        (srcA->m[i][3] * srcB->m[3][3]) ; 
} 

memcpy(result, &tmp, sizeof(PATRIA_Matrix)); 

也許我錯了,這個,但我敢肯定,你應該走這條路。

我看到你的榜樣的方式在我看來一個指針乘法:((雖然我沒有你MAT4矩陣類/結構的具體)。

+3

他使用的是GLM數學庫,它提供了一個覆蓋'*'運算符的'mat4'類。 – 2012-01-09 16:36:01

+0

對不起,你是完全正確的,我的壞。我對這個圖書館沒有很好的瞭解。我的錯,道歉。 – 2012-01-11 18:06:25