一.OpenGLES2.0原理浅析
1.
2.
每种变换都可以由相应的Matrix静态方法生成相应的变换矩阵。 坐标系原点在屏幕中央,z轴正方向垂直屏幕向外。
行为 | 变换 | 记录变换方式的放法 | 记录变换方式的[4*4]矩阵 |
眼睛相对物体的位置改变 | 视图变换 | Matrix.setLookAtM(mVMatrix, cx, cy, cz,//相机位置, tx, ty, tz,//观察点位置 upx, upy, upz//顶部朝向 ) | mVMatrix[16] |
物体平移 | 模型变换 | Matrix.translateM( mMMatrix, 0,//偏移量 x, y, z//平移量 ) | mMMatrix[16] |
物体按坐标缩放比例缩放 | Matrix.scaleM( mMMatrix, sx,sy, sz//缩放因子 ) | ||
物体旋转 | Matrix.rotateM( mMMatrix, 0,//偏移量 angle,//旋转角度 x, y, z//需要旋转的轴 ) | ||
凸透镜眼睛 | 投影变换 | Matrix.frustumM( mPMatrix, 0,//偏移量 left,right, buttom,top, near,far//near>0 ) | mPMatrix[16] |
平面透镜眼睛 | Matrix.orthoM( mPMatrix, 0,//偏移量 left,right, buttom,top, near,far//near>0 ) |
PS: 如果眼睛不是凸透镜而是平面透镜, 则不会产生近小远大的效果, 视图变换可由人眼模拟。函数参数都是float。
变换叠加: 可通过变换矩阵相乘得出想要的变换矩阵: Matrix.multiplyMM(
mMVPMatrix,
0,
3.
点 | GLES20.GL_POINTS |
线 | GLES20.GL_LINES |
GLES20.GL_LINE_STRIP | |
GLES20.GL_LINE_LOOP | |
面 | GLES20.TRIANGLES |
GLES20.TRIANGLE_TRIP//条带,可间断 | |
GLES20.TRIANGLE_FAN//扇面 |
非索引法:GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vCount);
索引法 :GLES20.glDrawElements(GLES20.GL_POINTS, iCount,GLES20.GL_UNSIGNED_BYTE,
二.android的openGLES2.0程序设计框架浅析
1.主要实现流程有如下顺序的几点操作:
定义物体顶点信息–>编辑着色器代码 –> 编译连接着色器程序 -> 物体顶点信息传入着色器 –> GLSurfaceView加载Renderer –> Activity加载GLSurfaceView -> 渲染物体输出屏幕
操作名称 | 一般实现方法 |
定义物体顶点信息 | (1)三维坐标信息; (2)三维法向量信息;(3)颜色信息或二维贴图坐标信息; |
编辑着色器代码 | |
编译连接着色器 | 主要方法:(1. InputStream in = rgetAssets .open(fname); (1. int shaderId= GLES20.glCreateShader(shaderType);// shaderType 如果申请成功则返回的shaderId不为零 (2. GLES20.glShaderSource(shaderId, source);///source是脚本字符串 GLES20.glCompileShader(shaderId);///编译 intcompiles[1]; GLES20.glGetShaderiv(shaderId, GLES20._GL_COMPILE_STATUS,compiles, 0);///查看编译情况 if(compiles[0] == 0){//编译失败,释放申请的着色器 } (1. (2. while((error =GLES20.glGetError()) != GLES20.GL_NO_ERROR){ } (3. GLES20.glLinkProgram(program); intLinkStatus[1]; GLES20.glGetPromgramiv(program,GLES20.GL_LINK_STATUS, LinkStatus, 0); if(LinkStatus[0]!=GLES20.GL_TRUE){ GLES20.glDeletePromgram(program); program =0; } |
物体顶点信息传入着色器 | 获取着色器参数ID 传入数据 使用数据:GLES20.glEnableVertexAttribArra |
GLSurfaceView加载Renderer | setEGLContextClientVersi setRanderer(new MyRenderer());//增添渲染器 setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//主动渲染模式 } |