OpenGL學習 列表

2021-05-17 08:57:01 字數 2943 閱讀 9186

(一)定義顯示列表

前面所舉出的例子都是瞬時給出函式命令,opengl瞬時執行相應的命令,這種繪圖方式叫做立即或瞬時方式(immediate mode)。opengl顯示列表(display list)是由一組預先儲存起來的留待以後呼叫的opengl函式語句組成的,當呼叫顯示列表時就依次執行表中所列出的函式語句。顯示列表可以用在以下場合:   

1)矩陣操作   大部分矩陣操作需要opengl計算逆矩陣,矩陣及其逆矩陣都可以儲存在顯示列表中。   

2)光柵點陣圖和影象   程式定義的光柵資料不一定是適合硬體處理的理想格式。當編譯組織乙個顯示列表時,opengl可能把資料轉換成硬體能夠接受的資料,這可以有效地提高畫位圖的速度。   

3)光、材質和光照模型   當用乙個比較複雜的光照環境繪製場景時,因為材質計算可能比較慢。若把材質定義放在顯示列表中,則每次改換材質時就不必重新計算了,因此能更快地繪製光照場景。   

4)紋理   因為硬體的紋理格式可能與opengl格式不一致,若把紋理定義放在顯示列表中,則在編譯顯示列表時就能對格式進行轉換,而不是在執行中進行,這樣就能大大提高效率。   

5)多邊形的圖案填充模式,即可將定義的圖案放在顯示列表中。   

opengl提供類似於繪製圖元的結構即類似於glbegin()與glend()的形式建立顯示列表,其相應的函式為:

void glnewlist(gluint list,glenum mode);

void glendlist(void);   

glnewlist()函式說明乙個顯示列表的開始,其後的opengl函式存入顯示列表中,直至呼叫結束表的函式glendlist(void)。glnewlist()函式中的引數list是乙個正整數,它標誌唯一的顯示列表;引數mode的可能值有gl_compile和gl_compile_and_execute;若要使列表中函式語句只存入而不執行,則用gl_compile;若要使列表中的函式語句存入表中且按瞬時方式執行一次,則用gl_compile_and_execute。   

注意:並不是所有的opengl函式都可以在顯示列表中儲存且通過顯示列表執行。一般來說,用於傳遞引數或返回數值的函式語句不能存入顯示列表,因為這張表有可能在引數的作用域之外被呼叫;如果在定義顯示列表時呼叫了這樣的函式,則它們將按瞬時方式執行並且不儲存在顯示列表中,有時在呼叫執行顯示列表函式時會產生錯誤。以下列出的是不能存入顯示列表的opengl函式:   

gldeletelists()    

glisenable()   

glfeedbackbuffer()  

glislist()   

glfinish()      

glpixelstore()   

glgenlists()     

glrendermode()   

glget*()       

glselectbuffer()   

在建立顯示列表以後就可以呼叫執行顯示列表的函式來執行它,並且允許在程式中多次執行同一顯示列表,同時也可以與其它函式的瞬時方式混合使用。顯示列表執行的函式形式如下:   

void glcalllist(gluint list);   

引數list指定被執行的顯示列表。顯示列表中的函式語句按它們被存放的順序依次執行;若list沒有定義,則不會產生任何事情。   

(二)管理顯示列表

在實際應用中,一般呼叫函式glgenlist()來建立多個顯示列表,這樣可以避免意外刪除,產生乙個沒有用過的顯示列表。此外,在管理顯示列表的過程中,還可呼叫函式gldeletelists()來刪除乙個或乙個範圍內的顯示列表。   

1)gluint glgenlist(glsizei range)   該函式分配range個相鄰的未被占用的顯示列表索引。這個函式返回的是乙個正整數索引值,它是一組連續空索引的第乙個值。返回的索引都標誌為空且已被占用,以後再呼叫這個函式時不再返回這些索引。若申請索引的指定數目不能滿足或range為0則函式返回0。   

2)glboolean glislist(gluint list)   該函式詢問顯示列表是否已被占用的情況,若索引list已被占用,則函式返回ture;反之,返回faulse。   

3)void gldeletelists(gluint list,glsizei range)   該函式刪除一組連續的顯示列表,即從引數list所指示的顯示列表開始,刪除range個顯示列表,並且刪除後的這些索引重新有效。   

(三)多級顯示列表

多級顯示列表的建立就是在乙個顯示列表中呼叫另乙個顯示列表,也就是說,在函式glnewlist()與glendlist()之間呼叫glcalllist()。多級顯示列表對於構造由多個元件組成的物體十分有用,尤其是某些元件需要重複使用的情況。但為了避免無窮遞迴,顯示列表的巢狀深度最大為64(也許更高些,這依賴於不同的opengl實現),當然也可呼叫函式glgetintegerv()來獲得這個最大巢狀深度值。opengl也允許用乙個顯示列表包含幾個低階的顯示列表來模擬建立乙個可編輯的顯示列表。   

下面的一段**使用了列表巢狀來顯示乙個三角形:   

glnewlist(1,gl_compile);   

glvertex3fv(v1);   

glendlist();   

glnewlist(2,gl_compile);   

glvertex3fv(v2);   

glendlist();   

glnewlist(3,gl_compile);   

glvertex3fv(v3);   

glendlist();   

glnewlist(4,gl_compile);   

glbegin(gl_polygon);   

glcalllist(1);   

glcalllist(2);   

glcalllist(3);   

glend();   

glendlist();

OpenGL 顯示列表

原 文 lesson 12 display lists 譯 者 marhoo 這次我將教你如何使用顯示列表,顯示列表將加快程式的速度,而且可以減少 的長度。當你在製作遊戲裡的小行星場景時,每一層上至少需要兩個行星,你可以用opengl中的多邊形來構造每乙個行星。聰明點的做法是做乙個迴圈,每個迴圈畫出...

OpenGL 顯示列表

相關主題 頂點緩衝區物件 vbo 顯示列表是一組被儲存或編譯的用來以後執行的opengl命令的集合。當乙個顯示列表被建立以後,所有的頂點資料和畫素資料被複製到位於伺服器端的顯示列表記憶體中。這個過程只進行一次。當顯示列表準備好 被編譯完成 後,你可以重複使用它而不需要在每幀中重複地傳輸這些資料。顯示...

OpenGL顯示列表

opengl的顯示列表 一 簡介 所謂顯示列表就是一組預選儲存起來的留待以後呼叫的函式語句。呼叫此顯示列表時就按次序執行其中函式。以前所有的函式呼叫可以稱之為立即方式 immediate mode 現在我們將介紹顯示列表方式 display list 顯示列表可以優化程式執行效能。它被設計成命令的快...