2011-08-28 38 views
1
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

//set viewpoint 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(VIEW_ANGLE,Screen_Ratio,NEAR_CLIP,FAR_CLIP); 
gluLookAt(0,5,5, 0,0,0, 0,1,0); 

//transform model 1 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(Theta, 0,1,0); 

//draw model 1 
glBegin(GL_QUADS); 
... 
glEnd(); 

上面的代碼工作正常,但有沒有任何方法可以刪除對gluPerspective的調用?如何僅使用gluPerspective一次?

我的意思是,我想在初始化時只調用它一次,而不是在每次渲染過程中重複。

+0

因爲沒有在代碼中調用gluPerspective,渲染會導致意想不到的結果。 – jondinham

+0

你爲什麼如此熱衷於避免這種情況? – Flexo

回答

5

你叫gluPerspective那裏,因爲它屬於那裏。 OpenGL不是您初始化事物的場景圖。這是一個狀態驅動的繪圖API。投影矩陣是一個狀態,每個嚴肅的圖形應用程序在整個單幀渲染過程中多次更改此狀態。

OpenGL不知道幾何對象,位置和相機。它只是通過處理管道推送點,線和三角形,並將結果繪製到屏幕上。在繪製完東西之後,OpenGL無論如何都沒有回憶它。

我的意思是在初始化時只調用它一次。

OpenGL未初始化(除了創建渲染上下文,但實際上這是操作系統的圖形堆棧的一部分,而不是OpenGL)。當然,您可以上傳紋理並緩衝對象數據,但這可能隨時發生。

1

如果你不叫glLoadIdentity()(其重置當前矩陣爲單位矩陣,即撤消什麼gluPerspective()做)的每一幀,而是仔細push/pop變換矩陣,你可以只在初始化調用逃脫它相當愉快。通常情況下,只要每次開始繪圖時調用加載標識然後將其重置,就更容易了。例如: -

// Initalisation 
glLoadIdentity(); 
gluPerspective(...); 

再後來就:

// Drawing each frame 
glClear(...); 

glPushMatrix(); 
gluLookAt(...); 

//draw stuff 

glPopMatrix(); 
+0

確實使用glPushMatrix&glPopMatrix增加了很多性能?相比於將每個對象移動到根(在調用glLoadIdentity的情況下) – jondinham

+0

我不會關注像這樣的操作的性能,每幀發生一次。它只是不值得。擔心幾何,着色器和紋理等等大問題。與那些測量'glLoadIdentity()'+'gluPerspective()'與'glPushMatrix()'+'glPopMatrix()'的成本相比,實際上是不可能的。 – Flexo

4

執行上投影矩陣使用gluLookAt,因爲它定義了相機/視圖,並且因此屬於模型視圖矩陣,通常作爲最左邊的變換(glLoadIdentity後的第一個),其中,它構成了圖模型視圖的一部分。雖然它也適用於你的方式,但它在概念上是錯誤的。這也可以解決您的問題,因爲您不必每幀觸摸投影矩陣。

但實際上,在OpenGL的狀態機體系結構中,datenwolf的方法在概念上更清晰。