1. 獲取著色器程序內(nèi)成員變量的id冻河,也可以理解為句柄原环、指針。
glGetAttribLocation方法:獲取著色器程序中婚脱,指定為attribute類型變量的id。
glGetUniformLocation方法:獲取著色器程序中勺像,指定為uniform類型變量的id障贸。
如:
// 獲取指向著色器中aPosition的index
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
// 獲取指向著色器中uMVPMatrix的index
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
2.傳遞數(shù)據(jù)
使用上一節(jié)獲取的指向著色器相應(yīng)數(shù)據(jù)成員的各個id,就能將我們自己定義的頂點數(shù)據(jù)吟宦、顏色數(shù)據(jù)等等各種數(shù)據(jù)傳遞到著色器當中了篮洁。
// 使用shader程序
GLES20.glUseProgram(mProgram);
// 將最終變換矩陣傳入shader程序
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
// 設(shè)置緩沖區(qū)起始位置
mRectBuffer.position(0);
// 頂點位置數(shù)據(jù)傳入著色器
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 頂點顏色數(shù)據(jù)傳入著色器中
GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false, 4*4, mColorBuffer);
// 頂點坐標傳遞到頂點著色器
GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 允許使用頂點坐標數(shù)組
GLES20.glEnableVertexAttribArray(maPositionHandle);
// 允許使用頂點顏色數(shù)組
GLES20.glDisableVertexAttribArray(maColorHandle);
// 允許使用定點紋理數(shù)組
GLES20.glEnableVertexAttribArray(maTextureHandle);
// 綁定紋理
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
// 圖形繪制
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);
2.1 glVertexAttribPointer,定義頂點屬性數(shù)組殃姓。
函數(shù)原型:
void glVertexAttribPointer (int index, int size, int type, boolean normalized, int stride, Buffer ptr )
參數(shù)含義:
index 指定要修改的頂點著色器中頂點變量id袁波;
size 指定每個頂點屬性的組件數(shù)量。必須為1蜗侈、2篷牌、3或者4。如position是由3個(x,y,z)組成踏幻,而顏色是4個(r,g,b,a))枷颊;
type 指定數(shù)組中每個組件的數(shù)據(jù)類型。可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT夭苗,初始值為GL_FLOAT信卡;
normalized 指定當被訪問時,固定點數(shù)據(jù)值是否應(yīng)該被歸一化(GL_TRUE)或者直接轉(zhuǎn)換為固定點值(GL_FALSE)题造;
stride 指定連續(xù)頂點屬性之間的偏移量傍菇。如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的界赔。初始值為0桥嗤。如果normalized被設(shè)置為GL_TRUE,意味著整數(shù)型的值會被映射至區(qū)間[-1,1](有符號整數(shù))仔蝌,或者區(qū)間[0,1](無符號整數(shù)),反之荒吏,這些值會被直接轉(zhuǎn)換為浮點值而不進行歸一化處理敛惊;
ptr 頂點的緩沖數(shù)據(jù)。
2.2 啟用或者禁用頂點屬性數(shù)組绰更。 調(diào)用glEnableVertexAttribArray和glDisableVertexAttribArray傳入?yún)?shù)index瞧挤。如果啟用,那么當glDrawArrays或者glDrawElements被調(diào)用時儡湾,頂點屬性數(shù)組會被使用特恬。
2.3 glActiveTexture, 選擇活動紋理單元徐钠。
函數(shù)原型:
void glActiveTexture (int texture)
參數(shù)含義:
texture指定哪一個紋理單元被置為活動狀態(tài)癌刽。texture必須是GL_TEXTUREi之一,其中0 <= i < GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS尝丐,初始值為GL_TEXTURE0显拜。
glActiveTexture()確定了后續(xù)的紋理狀態(tài)改變影響哪個紋理,紋理單元的數(shù)量是依據(jù)該紋理單元所被支持的具體實現(xiàn)爹袁。