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函數。