繪制一個立方體的時候,需要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類型的緩沖區中。
可以配置設定多個緩沖區對象,頂點坐标、顔色、紋理坐标等資料,可以各自單獨使用一個緩沖區
每個緩沖區可以有不同的性能提示,比如在繪制一個運動的人物時,頂點坐标資料經常變化,但法線向量、紋理坐标等則不會變化,可以給予不同的性能提示,以提高性能。