2010-11-16 53 views
2

大多數OpenGL ES教程爲Android,我跟着有onSurfaceChanged()這樣的功能:當調用glMatrixMode()

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 45.0f, ((float)width/(float)height), 0.1f, 100.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

然而,什麼是這裏的分組?必須在glViewport之後調用glMatrixMode()嗎?並且必須在glMatrixMode()之後調用glLoadIdentity()?

我一直在編寫「完整的」OpengGL之前,在我的舊代碼中我首先調用glMatrixMode(),然後gluPerspective和最後glLoadIdentity()。彷彿一個第一()設置應該使用什麼矩陣gluPerspective和最後一組glIdentity()來完成它。

什麼是調用glMatrixMode(),glIdentity()和gluPerspective()正確的順序 - 爲什麼? OpenGL和OpenGL ES之間在設置glMatrixMode()方面有區別嗎?

回答

9

glViewport()是完全獨立於矩陣的變換棧和可以在任何時間被調用。

glLoadIdentity()通常立即矩陣模式改變後,所以你開始「新鮮」如果你叫。矩陣變換如gluPerspective(),glOrtho(),glFrustum(),glRotate(),glMultMatrix(),glTranslate()是累積的操作,因爲它們聚集,讓您描述複雜的3D世界空間變換或描述你的OpenGL觀看卷。例如:如果我想然後翻譯在+ X方向上的立方體圍繞Z軸旋轉我發出glRotate()後跟一個glTranslate()。 glLoadIdentity()用單位矩陣消除矩陣(當前矩陣模式),因此在glPoadIdentity()之後的gluPerspective()等價於對glLoadIdentity()的單個調用。換句話說,那個序列是無意義的。

逆向的這些因爲gluPerspective()將乘以透視當前矩陣變換的順序。如果當前矩陣是一種身份,然後乘只會導致gluPerspective()矩陣變換這是你想要什麼,你的投影矩陣模式的99%的時間,當角度看。

有到glMatrixMode()的行爲或如何將這些矩陣函數修改GL矩陣狀態的OpenGL和OpenGL ES之間沒有差異相對於。

+0

這是一個很好的解釋,什麼是不同的功能。感謝名單! – Espen 2010-11-17 07:13:20

2

glLoadIdentity加載單位矩陣到當前矩陣(由glMatrixMode激活),由此重置它。我不明白如何首先調用gluPerspective,然後glLoadIdentity會完成任何合理的事情。

您發佈的代碼正好是你會怎麼做普通的OpenGL了。

+0

感謝名單清理這件事。我想我已經錯過了一些舊的代碼。 – Espen 2010-11-16 17:39:45