OpenGL頂點數組

OpenGL頂點數組

遊戲的實際的開發中將會大量頻繁地處理頂點,在簡單多邊形可以使用代碼直接生成模型頂點.而真正的遊戲隨便一個模型就可能有幾百或幾千個多邊形.不可能使用代碼直接生成.解決的方法是使用『頂點數組』(Vertex Array).通過建模軟件進形3D建模,然後輸出特定的文本文檔或二進制文檔.可分為以下幾個部驟.

  1. 從磁盤上的模型文檔中載入模型的頂點數據.
  2. 將頂點數據儲存在數組(array),如將頂點座標存入獨立數組,法線數組,顏色數組.
  3. 當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幀.性能有驚人的提升(不同的計算機性能有所差別).按空格鍵啟用或禁用頂點數組.演示程式下載:

 

評論