2011-03-14 60 views
2

我正嘗試在iPhone上將我的OpenGL ES 1.1的知識更新到2.0。 iPhone的默認OpenGL ES應用程序模板繪製一個正方形,並使其上下翻轉並正常工作。他們的實現對着色器本身的Y值變化進行了數學計算,這幾乎沒有用處。所以,我已經改變了vertext着色器:在iPhone上使用着色器翻譯正方形

uniform mat4 mvpMatrix; 

attribute vec4 position; 
attribute vec4 color; 
varying vec4 colorVarying; 


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

這似乎是正確的,共同的(從我在研究中所看到)。很明顯,我對代碼做了必要的修改,比如綁定統一的代碼,爲了幫助數學,我得到了esUtil.h代碼的源代碼。在繪製方法,我的代碼看起來是這樣的:

transY += 0.075f; 

ESMatrix mvp, model, view; 
esMatrixLoadIdentity(&view); 
esPerspective(&view, 60.0, 320.0/480.0, 1.0, -1.0); 

esMatrixLoadIdentity(&model); 
esTranslate(&model, sinf(transY), 0.0f, 0.0f); 

esMatrixLoadIdentity(&mvp); 
esMatrixMultiply(&mvp, &model, &view); 
glUniformMatrix4fv(uniforms[UNIFORM_MVPMATRIX], 1, GL_FALSE, (GLfloat *)&mvp); 

這應該是工作,但不幸的是,我所得到的是一個簡單的翻譯完全不同。

Screenshot

我已經重新啓動模板了幾次,但我不能找出我在做什麼錯在這裏...旋轉似乎是按預期工作,我相信...

任何幫助,將不勝感激。

回答

3

我認爲你想扭轉你的位置變換的順序,因爲你的矩陣庫可能按照列主要的順序工作。

gl_Position = position * mvpMatrix; 

=>

gl_Position = mvpMatrix * position; 
+1

是的,如果你在OpenGL的正常配置模型視圖矩陣餵養,我相信你需要把它放在你的頂點着色器的乘法中。至少,這就是我所有着色器的工作方式,就像這個示例應用程序中的那些:http://www.sunsetlakesoftware.com/sites/default/files/ShaderExamples.zip – 2011-03-15 14:40:56

+0

謝謝,就是這樣!我現在需要弄清楚這裏的確切數學問題,以及爲什麼有些東西使用列而其他東西不使用。我假設乘法(即使在矩陣上)是可交換的。 – 2011-03-15 15:00:08

+0

線性代數文本將覆蓋這些規則,但您也可以獲得3D數學入門書,它將爲您提煉出線性代數的相關部分。如果一個文本使用'行順序',你會像v'= vM那樣轉換矩陣,'列順序'是v'= Mv。 – LazyBitStream 2011-03-15 17:47:47

1

在不知不覺中,你已經做出了攝像頭位置變化。在opengles中,相機(全局)和對象(局部)轉換恰好相反。