遊戲的實際的開發中將會大量頻繁地處理頂點,在簡單多邊形可以使用代碼直接生成模型頂點.而真正的遊戲隨便一個模型就可能有幾百或幾千個多邊形.不可能使用代碼直接生成.解決的方法是使用『頂點數組』(Vertex Array).通過建模軟件進形3D建模,然後輸出特定的文本文檔或二進制文檔.可分為以下幾個部驟.
- 從磁盤上的模型文檔中載入模型的頂點數據.
- 將頂點數據儲存在數組(array),如將頂點座標存入獨立數組,法線數組,顏色數組.
- 當OpenGL需要頂點數據時,載入相應的數據.
啟用『頂點數組』
void glEnableClientState(GLenum array);
禁用『頂點數組』
void glDisableClientState(GLenum array);
參數 | 簡介 |
GL_COLOR_ARRAY | 啟用頂點顏色數組 |
GL_EDGE_FLAG_ARRAY | 啟用頂點的邊EdgeFlag數組 |
GL_INDEX_ARRAY | 啟用頂點的調色板索引數組 |
GL_NORMAL_ARRAY | 啟用法線數組 |
GL_TEXTURE_COORD_ARRAY | 啟用紋理座標數組 |
GL_VERTEX_ARRAY | 啟用定點座標數組 |
載入頂點的顏色數組:
void glVertexPointer(GLint size,GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
size | 頂點顏色分量其值只能為3(rgb)或4(rgba) |
type | 數組的數據類型
GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_DOUBLE |
stride | 跨度,兩個顏色之間的字節數,如果顏色數據是緊湊則填為0 |
pointer | 頂點的顏色數組 |
載入邊(Edge)數組:
void glEdgeFlagPointer(GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
stride | 跨度 |
pointer | 多邊形邊(Edge)數組bool類型數值 |
載入調色板顏色索引數組
void glIndexPointer(GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
type | 數組的數據類型
GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度相鄰索引之間的字節數 |
pointer | 調色板顏色索引數組 |
載入頂點的法線向量,每三個元素組成一個法線向量
void glNormalPointer(GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
type | 數組的數據類型
GL_BYTE GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度相鄰法線之間的字節數 |
pointer | 頂點的法線向量數組 |
載入頂點的紋理座標數組void glTexCoordPointer(Glint size,GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
size | 頂點的座標數,其值只能為1,2,3,4
1為1維紋理(s) 2為2維紋理(s,t) 3與4較小使用 |
type | 數組的數據類型
GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度,兩個紋理之間的字節數 |
pointer | 頂點紋理座標數組 |
載入頂點座標數組:
void glVertexPointer(Glint size,GLenum type,GLsizei stride,const GLvoid *pointer);
參數 | 簡介 |
size | 頂點的座標分量:2,3,4 |
type | 數組的數據類型
GL_SHORT GL_INT GL_FLOAT GL_DOUBLE |
stride | 跨度,兩個頂點座標之間的字節數,如果是緊湊方置其值為0 |
pointer | 頂點座標數組 |
繪畫所有當前以啟用的頂點數組void glDrawArrays(GLenum mode,GLint first,GLsizei count);
參數 | 簡介 |
mode | GL_POINTS:點
GL_LINE_STRIP:相連的直線 GL_LINE_LOOP:閉合的相連直線 GL_LINES:非相連的直線 GL_TRIANGLE_STRIP:相連的三角形 GL_TRIANGLE_FAN:共用頂點三角形 GL_TRIANGLES:度立的三角形 GL_QUAD_STRIP:相連的四邊形 GL_QUADS:四邊形 GL_POLYGON:任意頂點多邊形 |
first | 數組起此索引 |
count | 繪畫的頂點量 |
以任意順序繪畫以啟用的頂點數組void glDrawElements(GLenum mode,GLsizei count,GLenum type,const GLvoid *indices);
參數 | 簡介 |
mode | 與glDrawArrays()的一致 |
count | 索引數組的長度 |
type | 索引的數據類型,只能是無符號整數GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT GL_UNSIGNED_INT |
indices: | 索引數組 |
按值定的範圍繪畫以啟用的頂點數組
void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
參數 | 簡介 |
mode | 與glDrawArrays()的一致 |
start | 索引數組開此索引 |
end | 索引數組結束索引 |
count | 索引數組的長度 |
type | 索引的數據類型,只能是無符號整數與glDrawElements()的一致 |
indices: | 索引數組 |
按數組索引繪畫單一個頂點void glArrayElement(GLint index);
參數 | 簡介 |
index | 頂點的索引 |
演示程式中繪畫幾百個球體不斷移動,若不使用頂點數組每秒只有約66幀,而若使用頂點數組性能大幅度提升到每秒有200幀.性能有驚人的提升(不同的計算機性能有所差別).按空格鍵啟用或禁用頂點數組.演示程式下載: