OpenGL ES學習之繪製函數的選擇

    我們都知道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);

後面這個函數可以節省數據的存儲空間,當要繪製叫複雜的實體的時候,它是個很好的選擇。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章