本文主要是介绍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);///编译 int compiles[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); int LinkStatus[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);//主动渲染模式 } |
这篇关于OpenGLES2.0原理浅析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!