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);//主动渲染模式 } |