Android OpenGL ES 開發(十): 通過GLES20與着色器交互


1. 獲取着色器程序內成員變量的id(句柄、指針)

GLES20.glGetAttribLocation方法:獲取着色器程序中,指定為attribute類型變量的id。
GLES20.glGetUniformLocation方法:獲取着色器程序中,指定為uniform類型變量的id。

如:

// 獲取指向着色器中aPosition的index
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
// 獲取指向着色器中uMVPMatrix的index
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

2. 向着色器傳遞數據

使用上一節獲取的指向着色器相應數據成員的各個id,就能將我們自己定義的頂點數據、顏色數據等等各種數據傳遞到着色器當中了。

// 使用shader程序
GLES20.glUseProgram(mProgram);
// 將最終變換矩陣傳入shader程序
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
// 設置緩沖區起始位置
mRectBuffer.position(0);
// 頂點位置數據傳入着色器
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 頂點顏色數據傳入着色器中
GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false, 4*4, mColorBuffer);
// 頂點坐標傳遞到頂點着色器
GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 允許使用頂點坐標數組
GLES20.glEnableVertexAttribArray(maPositionHandle);
// 允許使用頂點顏色數組
GLES20.glDisableVertexAttribArray(maColorHandle);
// 允許使用定點紋理數組
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 定義頂點屬性數組

void glVertexAttribPointer (int index, int size, int type, boolean normalized, int stride, Buffer ptr )

參數含義:
index 指定要修改的頂點着色器中頂點變量id;
size 指定每個頂點屬性的組件數量。必須為1、2、3或者4。如position是由3個(x,y,z)組成,而顏色是4個(r,g,b,a));
type 指定數組中每個組件的數據類型。可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT;
normalized 指定當被訪問時,固定點數據值是否應該被歸一化(GL_TRUE)或者直接轉換為固定點值(GL_FALSE);
stride 指定連續頂點屬性之間的偏移量。如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的。初始值為0。如果normalized被設置為GL_TRUE,意味着整數型的值會被映射至區間-1,1,或者區間[0,1](無符號整數),反之,這些值會被直接轉換為浮點值而不進行歸一化處理;
ptr 頂點的緩沖數據。

2.2 啟用或者禁用頂點屬性數組

調用GLES20.glEnableVertexAttribArray和GLES20.glDisableVertexAttribArray傳入參數index。

GLES20.glEnableVertexAttribArray(glHPosition);
GLES20.glEnableVertexAttribArray(glHCoordinate);

如果啟用,那么當GLES20.glDrawArrays或者GLES20.glDrawElements被調用時,頂點屬性數組會被使用。

2.3 選擇活動紋理單元。

void glActiveTexture (int texture)

texture指定哪一個紋理單元被置為活動狀態。texture必須是GL_TEXTUREi之一,其中0 <= i < GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,初始值為GL_TEXTURE0。
GLES20.glActiveTexture()確定了后續的紋理狀態改變影響哪個紋理,紋理單元的數量是依據該紋理單元所被支持的具體實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM