2011-07-11 150 views
0

我想提請使用OpenGL ES 2.0的四邊形。 我的頂點着色器看起來是這樣的:的OpenGL ES 2.0:矩陣乘法問題

uniform mat4 mvp; 
attribute vec4 position; 
attribute vec4 color; 
varying vec4 colorVarying; 

void main() 
{ 
    gl_Position = mvp * position; 
    colorVarying = color; 
} 

如果我使用這些頂點:

-1.0f, -1.0f, 0.f, 1.f, 
1.0f, -1.0f, 0.f, 1.f, 
-1.0f, 1.0f, 0.f, 1.f, 
1.0f, 1.0f, 0.f, 1.f 

這個矩陣(列優先的順序一樣,都屬於以下矩陣):

0.5,0,0,0, 
0, 1,0,0, 
0, 0,1,0, 
0.5,0,0,1 

四覆蓋視口的右半部分。事實上,如果我乘這兩個矩陣我得到的頂點

0, -1,  0,  1, 
1, -1,  0,  1, 
0,  1,  0,  1, 
1 , 1,  0,  1, 

,如果我使用這些頂點和單位矩陣,我得到了相同的結果。所以看來乘法是正確的。現在

,如果我乘這些頂點(A):

-100.0f, -100.0f, 301.0f, 1.0f, 
100.0f, -100.0f, 301.0f, 1.0f, 
-100.0f, 100.0f, 301.0f, 1.0f, 
100.0f, 100.0f, 301.0f, 1.0f, 

這個矩陣(M):

0.4170   0   0   0 
    0 0.5560   0   0 
    0   0 -1.2220 -1.0000 
    0   0 444.4440   0 

我得到這些頂點(B):

0.2075, 0.2766, -0.9892, 1.0000 
-0.2075, 0.2766, -0.9892, 1.0000, 
0.2075, -0.2766, -0.9892, 1.0000, 
-0.2075, -0.2766, -0.9892, 1.0000, 

如果我通過我的着色器在B頂點和單位矩陣,它呈現在視口中中間的小矩形。但是如果我將它傳遞給A頂點和M矩陣,它什麼都不呈現。

發生了什麼事?

回答

0

的問題是,後GL_POSITION頂點着色器完成經過,在其中依靠在範圍[-W W]比較和剪切(未示出),如果它落在GL_POSITION該範圍之外削波。

如果您乘以A * M並將結果設置爲gl_Position,則給定您使用W座標的矩陣將爲-301,這是一個負數,這將反轉削波比較。

嘗試在乘法之前將矩陣M乘以-1,即可得到與矩陣B乘以單位矩陣相同的結果。

從 「Red Book」:

避免使用負W¯¯頂點座標和負Q紋理座標。 OpenGL的可能無法正確剪輯此座標和底紋由這種座標定義的原語時,可能使插值誤差。

+0

嗯...現在我不知道接受哪個答案。該解決方案原來只是將右下象限乘以-1,而不是整個矩陣。但是,您可能會說正確的是否定的w是問題。我認爲這是三角形是片面的,但是當我試圖繪製一個單一的三角形時,無論我按什麼順序列出頂點,它都會被繪製出來,所以這似乎不是問題。 – LaC

0

您正在使用可能不會使用相同的矩陣順序GLSL數學庫。在將它傳遞給着色器之前,嘗試轉換矩陣M.

+0

我沒有使用任何數學庫。我按列順序放置矩陣和頂點。此外,如果這是問題,那麼半視窗矩形的第一次嘗試也不會奏效。儘管如此,我還是嘗試了移調,但它仍然沒有顯示任何內容。 – LaC

0

問題在於,在wz單元格中的-1時,三角形以相反方向正常結束,並且由於它們是片面的,因此它們未被繪製。我通過改變M至這個解決了這個問題:

0.4170   0   0   0 
    0 0.5560   0   0 
    0   0 1.2220 1.0000 
    0   0 -444.4440   0 

我也改變了z支柱的符號(實際上以來連續矩陣轉置),以保持-1作爲近及+1遠在z軸。