Android OpenGL ES 开发(十): 通过GLES20与着色器交互
2018-01-17 13:48
639 查看
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()确定了后续的纹理状态改变影响哪个纹理,纹理单元的数量是依据该纹理单元所被支持的具体实现。
相关文章推荐
- Android OpenGL ES 开发教程(20):颜色Color
- 【Android开发学习20】多个Activity间的交互之Intent
- Android开发:客户端与服务器通过传递和接收json数据进行交互
- 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL
- 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- Android开发OpenGL ES的流程,从着色器编写到显示在屏幕上
- android native+h5——混合开发初步,通过js交互数据
- Android OpenGL ES 开发教程(20):颜色Color
- android开发步步为营之6:客户端通过tcp和服务端进行交互
- Android OpenGL ES 开发教程(20):颜色Color
- Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)
- Android开发之Fragment与Activity的数据交互通过回调机制实现
- Android OpenGL ES 开发教程(20):颜色Color
- android开发步步为营之4:客户端通过http和服务端进行交互
- Android OpenGL ES 开发教程(20):颜色Color
- Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)
- 【Android开发学习12】Android OpenGL ES 旋转glRotatef
- 【Android开发学习13】Android OpenGL ES 3D空间与glDrawArrays
- Android Map Api 使用和开发(2) 定位我的位置、地图弹出泡泡、通过经纬度获取地址