天天看點

OpenGL學習筆記:頂點數組

繪制一個立方體的時候,需要6個正方形,普通的畫法,需要指定6 × 4 = 24個頂點

進一步優化:指定8個頂點,存在數組中,再建立另外一個數組,儲存每個面使用的頂點序号。就是一個比較合理的程式結構。但程式依然要循環24次,分别指定每個正方形的頂點。

進一步優化,使用頂點數組:

1. 頂點數組和前面的優化方法一樣,一個數組儲存頂點,一個數組儲存頂點序号

2. 優點:不需要用普通的算法循環逐個循環指定頂點,而是把這兩個數組傳個OpenGL,OpenGL自動的查找頂點并繪制。減少了函數運作次數,提高運作效率

頂點數組是儲存在用戶端的,該機制也是在用戶端生效。伺服器端并不知道是否啟用定點數組,也不關注

使用頂點數組的方法:

glEnableClientState(GL_VERTEX_ARRAY); //啟動頂點數組功能

glVertexPointer(3, GL_FLOAT, 0, vertex_list);//指定儲存頂點的數組

glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, index_list); //指定儲存頂點序号的數組,并開始繪制

頂點數組還可以儲存配套的與頂點相關的資訊:

1. 紋理坐标

2. 法線向量

3. 顔色

頂點的每一個屬性都可以指定一個數組,然後用統一的序号來進行通路。比如序号3,就表示取得顔色數組的第3個元素作為顔色、取得紋理坐标數組的第3個元素作為紋理坐标、取得法線向量數組的第3個元素作為法線向量、取得頂點坐标數組的第3個元素作為頂點坐标。把所有的資料綜合起來,最終得到一個頂點。

可以用glEnableClientState/glDisableClientState單獨的開啟和關閉每一種數組。

glEnableClientState(GL_VERTEX_ARRAY); 

glEnableClientState(GL_COLOR_ARRAY); 

glEnableClientState(GL_NORMAL_ARRAY); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

用以下的函數來指定數組的位置:

glVertexPointer 
glColorPointer 
glNormalPointer 
glTexCoordPointer

glInterleavedArrays:

把所有的頂點資料(法線,顔色等)都混合起來,指定到同一個數組中。這就是混合數組

頂點數組和顯示清單不同,顯示清單儲存在伺服器端,頂點數組儲存在用戶端, 優缺點:

1. 頂點數組儲存在本地,可以随時修改,而顯示清單在伺服器端,無法修改

2. 每次繪制時,頂點數組需要傳送到伺服器端,效率稍低。顯示清單在伺服器端,每次繪制無需傳送

頂點緩沖區對象的出現:

1. 頂點資料儲存在伺服器端

2. 可以随時修改

頂點緩沖區對象跟紋理對象有很多相似之處。首先,配置設定一個緩沖區對象編号,然後,為對應編号的緩沖區對象指定資料,以後可以随時修改其中的資料。

下面的表格可以幫助類比了解。

紋理對像 頂點緩沖區對象
配置設定編号  glGenTextures  glGenBuffersARB
綁定(指定為目前所使用的對象) glBindTexture glBindBufferARB
指定資料  glTexImage* glBufferDataARB 
修改資料 glTexSubImage* glBufferSubDataARB

頂點資料和序号各自使用不同的緩沖區。具體的說,就是頂點資料放在GL_ARRAY_BUFFER_ARB類型的緩沖區中,序号資料放在GL_ELEMENT_ARRAY_BUFFER_ARB類型的緩沖區中。

可以配置設定多個緩沖區對象,頂點坐标、顔色、紋理坐标等資料,可以各自單獨使用一個緩沖區

每個緩沖區可以有不同的性能提示,比如在繪制一個運動的人物時,頂點坐标資料經常變化,但法線向量、紋理坐标等則不會變化,可以給予不同的性能提示,以提高性能。

繼續閱讀