我們都知道OpenGL ES只是OpenGL的一個子集,所以很多API不能使用,在繪製複雜圖形的時候,也只能通過繪製三角面的形式來實現,不能直接繪製四邊形,繪製圖形的函數有兩個:oid glDrawArrays(GLenum mode, GLint first, GLsizei count),void glDrawElements(GLenum mode, GLsizei count,GLenum type, const GLvoid *indices)。
void glDrawArrays(GLenum mode, GLint first, GLsizei count),這個函數是要存儲所有要繪製的頂點,如果某頂點要重複獲知,就要重複存儲,如:
glDrawArrays(GL_TRIANGLES, 0, 6),它要存儲六個頂點的信息。調用該函數之後能繪製兩個三角形,索引從0開始的6個點(0,1,2)(3,4,5)。
void glDrawElements(GLenum mode, GLsizei count,GLenum type, const GLvoid *indices),這個函數就是要存儲不同的頂點,和對應的索引,頂點可以公用,如在繪製一個正方體的時候,只要存8個頂點的數據。正方體是六個面,就有12個三角形,每個三角形3個頂點。這樣就尋妖存儲36個索引。
繪製一個六面體的關鍵代碼如下:
#define VERTEX_POS_INDX 0
GLfloat vertices[] = { … };// (x, y, z) per vertex 8個頂點座標值
GLubyte indices[36] = { 0, 1, 2, 0, 2, 3,
0, 3, 4, 0, 4, 5,
0, 5, 6, 0, 6, 1,
7, 6, 1, 7, 1, 2,
7, 4, 5, 7, 5, 6,
7, 2, 3, 7, 3, 4 };
glEnableVertexAttribArray(VERTEX_POS_INDX);
glVertexAttribPointer(VERTEX_POS_INDX, 3, GL_FLOAT, GL_FALSE,0, vertices);
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLubyte),GL_UNSIGNED_BYTE, indices);
後面這個函數可以節省數據的存儲空間,當要繪製叫複雜的實體的時候,它是個很好的選擇。