2010-12-15 163 views
0

這是我的頂點着色器代碼:OpenGL ES 2.0的矩陣

attribute vec4 position; 
attribute vec4 inputTextureCoordinate; 

varying vec2 textureCoordinate; 

uniform mat4 modelViewProjMatrix; 

void main() 
{ 
    gl_Position = modelViewProjMatrix * position; 
textureCoordinate = inputTextureCoordinate.xy; 
} 

我在此代碼更新均勻:

glUniformMatrix4fv(制服[UNIFORM_MODELVIEWMATRIX],1,0,[scaleMatrix getMatrix]);

但是,當我執行此字符串最後更新結果(標度)重置:

glUniformMatrix4fv(制服[UNIFORM_MODELVIEWMATRIX],1,0,[rotationMatrix getMatrix]);

我如何使用多個矩陣?

回答

1

你必須將矩陣相乘。在CPU中執行此操作並將結果作爲制服傳遞。

1

也可以向着色器發送多個矩陣。您必須在着色器中定義一個(或多個)額外的統一mat4,並將其綁定到應用程序中的着色器程序。

您可以用*運算着色器乘矩陣,所以如果你想,說,已被應用的立場,觀點和投影之前完成對象的額外的旋轉,着色器應該是這樣的:

attribute vec4 position; 
attribute vec4 inputTextureCoordinate; 

varying vec2 textureCoordinate; 

uniform mat4 modelViewProjMatrix; 
uniform mat4 rotationMatrix; //your new matrix 

void main() 
{ 
    gl_Position = modelViewProjMatrix * rotationMatrix * position; 
    textureCoordinate = inputTextureCoordinate.xy; 
} 

請注意,在這種情況下,如果您不想進行任何旋轉,則必須爲您的着色器提供一個標識爲rotationMatrix的矩陣。

您可能已經知道這一點,但只是要確保:矩陣乘法是從右到左,所以如果您想圍繞模型的軸進行旋轉,然後將模型移動到某處,則需要將旋轉矩陣在您的翻譯矩陣的右側。

如果有人知道發送兩個矩陣的性能影響與CPU上的乘法和發送一個矩陣有什麼關係,我很樂意聽到這個消息。

+0

+1對於perfomance提示答案 – 2011-04-29 04:26:05

+2

我認爲modelViewProjMatrix * rotationMatrix對於對象的每個頂點都是不變的,所以如果它將在CPU上計算,它會增加性能 – 2011-04-29 04:27:36