glDrawArrays和glDrawElements 的區別

1. glDrawArrays有3個參數

void glDrawArrays(

int mode,

int first,

int count

);

參數1 mode : 繪圖的類型:

 

1.GL_TRIANGLES:每三個頂點之間繪製三角形,之間不連接

 

2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式繪製三角形,以第一個頂點開始連接

 

3.GL_TRIANGLE_STRIP:順序在每三個頂點之間均繪製三角形。這個方法可以保證從相同的方向上所有三角形均被繪製。以V0V1V2,V1V2V3,V2V3V4……的形式繪製三角形

 

參數2 first :從數組緩存中的哪一位開始繪製,一般都定義爲0

 

參數3 count:頂點的數量

第一個三角形是逆時針第二個是順時針,如果第二個是逆時針有時候可以畫出總之很容易出問題,同glDrawElements一樣。

 

2. glDrawElements 有4個參數,

void glDrawElements(

int mode,//點的類型

int count,//點的個數

int type,//第四個參數的類型

java.nio.Buffer indices //點的存儲繪製順序

);

如正方形:0             1    

                  3             2

例如:
mDrawListBuffer = ByteBuffer.allocateDirect(VERTEX_ORDER.length).order(ByteOrder.nativeOrder());
mDrawListBuffer.put(VERTEX_ORDER).position(0);
1)點類型GLES20.GL_TRIANGLE_STRIP :
GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, VERTEX_ORDER.length, GLES20.GL_UNSIGNED_BYTE, mDrawListBuffer);
   頂點順序: VERTEX_ORDER[] = {0, 1, 3, 2}

2)點類型GLES20.GL_TRIANGLE_FAN

GLES20.glDrawElements(GLES20.GL_TRIANGLE_FAN, VERTEX_ORDER.length, GLES20.GL_UNSIGNED_BYTE, mDrawListBuffer);

頂點順序: VERTEX_ORDER[] = {0, 1, 2, 3}

3)點類型GLES20.GL_TRIANGLES

GLES20.glDrawElements(GLES20.GL_TRIANGLES, VERTEX_ORDER.length, GLES20.GL_UNSIGNED_BYTE, mDrawListBuffer);
頂點順序:VERTEX_ORDER[] = {0, 1, 2, 2, 3, 0}

使用區別:

gl.glDrawArrays 設置頂點和紋理buffer的時候,位置已經寫好了

gl.glDrawElements order是按照你設置的頂點和紋理的順序

性能區別:

glDrawArrays 傳輸或指定的數據是最終的真實數據,在繪製時效能更好
glDrawElements 指定的是真實數據的調用索引,在內存/顯存佔用上更節省

glDrawArrays 和 glDrawElements的損耗說明及其使用場景

glDrawArrays 主要講數據空間損耗在頂點的定義處;
glDrawElements 主要講數據空間損耗在頂點索引的定義處;
如果在你的工程中,畫的圖形較少或者,圖形雖多但很多相同的,則可採用glDrawArrays更節省數據佔用的空間;相反,如果圖形多,而且形狀大不相同的時候,可以優先考慮採用glDrawElements函數。

 

發佈了5 篇原創文章 · 獲贊 43 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章