2015-02-08 51 views
0

我有進行各種變換和設置爲glPushMatrix()和glPopMatrix()調用之間的顏色,基本上像這樣的代碼:的OpenGL:矩陣堆棧的功能

glLoadIdentity(); 
glPushMatrix(); 

glPushMatrix(); 
// C++ code to perform transformations 
// C++ code to set colour 
// C++ code to draw polygon 
glPopMatrix(); 

// Other similar code "blocks" between calls to glPushMatrix() and glPopMatrix() 

glPushMatrix(); 
// C++ code to perform transformations 
// C++ code to set colour 
// C++ code to draw polygon 
glPopMatrix(); 

我的理解是一個單位矩陣是在開始時被推入堆棧,隨後被代碼中的每個連續的「塊」複製,轉換,呈現和彈出,並且彈出消除了來自先前轉換的所有效果。

但是,如果我註釋掉,設置在不是最後的塊中的任何塊的顏色代碼,該塊現在繼承如果施加的顏色,在最後的塊

這是有道理的設置顏色到整個堆棧,並因此保留對glPopMatrix()的調用。但是,在最後一個塊中創建的多邊形看起來是最後呈現的,因爲它位於所有其他多邊形之上 - 所以我沒有看到最終塊中設置的顏色如何應用於已經存在的多邊形被渲染。

問題:

1)什麼屬性/效果求生存,以glPopMatrix()的調用?

2)上述代碼中的操作順序是什麼?這些塊是以相反順序執行的,是以相反順序執行的每個塊中的代碼,還是兩者都執行?

+3

我知道你是剛開始學習OpenGL的,但功能,如glPushMatrix,glLoadIdentity和glPopMatrix已被棄用,不再是核心OpenGL標準的一部分。請考慮學習'現代'的OpenGL。 – 2015-02-08 11:01:32

+0

@ Sir.Tiddlesworth:謝謝。我知道這一點。正如我在OP中所說的,這是一個學校作業的起始代碼,我必須照原樣處理。 – Schemer 2015-02-08 14:41:24

回答

2

如其名字所示,glPushMatrix() and glPopMatrix()只保存/恢復矩陣狀態。顏色值不存儲 - 您需要使用glPushAttrib()代替。

OpenGL指令按您期望的順序處理:從頭到尾。如果您刪除第一個多邊形的glColor3f()材料,則通常會看到最終的多邊形的顏色值,因爲最後一個定義的顏色值(即爲最終多邊形設置的一個顏色值)仍然是「主動「顏色值當屏幕重新繪製時

順便說一句,你不需要在一開始兩次推矩陣狀態:

glLoadIdentity(); 
glPushMatrix(); 

glPushMatrix(); 

glLoadIdentity()功能設置當前矩陣狀態 - 有沒有必要將其推到堆棧之後。您的代碼既可以是這樣的:

glLoadIdentity(); // Set the matrix to an "identity" state. 

glPushMatrix(); // Save the identity matrix. 
transformTheMatrix(); 
drawSomething(); 
glPopMatrix(); // Restore the identity matrix. 

glPushMatrix(); // Save the identity matrix. 
transformTheMatrix(); 
drawSomething(); 
glPopMatrix(); // Restore the identity matrix. 

...甚至這樣的:

glLoadIdentity(); 
transformTheMatrix(); 
drawSomething(); 

glLoadIdentity(); 
transformTheMatrix(); 
drawSomething();