OpenGLES 绘制三角形
程序员文章站
2024-02-20 23:29:52
...
OpenGLES 绘制三角形
需要用到OpenGLES ,所以在安卓开发的指导文档里学习。但是在学习第一个绘制三角形时,一切流程似乎都是对的,但是就是不能够正常绘制三角形,前后卡了**个钟,一开始对照官方文档每行代码一一排查都没有找到,休息了快两个钟,然后在CSDN找了一篇类似的教程Android OpenGL ES2.0(一):详细讲解如何绘制一个三角形,再一次鼓起勇气一一同样对比排查。终于发现原因所在:将着色器的类型设置错误,本应如下,应为“GL_VERTEX_SHADER”,但我依赖于自动输入又不检查,粗心大意,写成了“GL_SHADER_TYPE ”
顺便回忆一下,绘制图形的基本步骤。
基本步骤
1.GL_SurfaceView 一个view 本身空白,需要Render进行渲染,可以理解为一块画布
2.应用了GL_SurfaceView.Renderer接口的自定义渲染类,用于图形绘制。
应用此接口需要重写其中三个类
- onSurfaceCreated 初始化,绘制三角形中,三角形对象将首先在此进行对象实例的创建。
- onSurfaceChanged 当屏幕尺寸发生变化是调用,如竖屏转横屏。
- onDrawFrame 绘制图像
三角形的绘制:
1.定义顶点坐标
- 个数:3
- 坐标:以浮点数组存储,每个点使用3个浮点数记录,分别为x,y,z
- 颜色:RGBA格式,长度为4的浮点数组
- 相应的着色器GLSL代码,具体使用查阅文档此处应有顶点着色的vertexShader与用于颜色着色的fragmentShader
2.初始化
此处代码在onSurfaceCreated中使用,因为绘制的图形多样,安卓建议建立图形类,通过调用构造函数进行,三角形的初始化包括:
- 将顶点浮点数组转为浮点缓存类FloatBuffer,以提高效率
- 建立空白的编译程序mProgram =GLES20.glCreateProgram,将着色程序字段添加至其中。然后注册关联
绘制
此处代码在onDrawFrame中使用,此处调用三角形类的draw函数,包括:
- 使用初始化阶段定义的mProgram
- 定义位置句柄与颜色句柄,取出编译的程序mProgram中的位置变量与颜色变量。
- 启动句柄,赋值,绘制。
增加投影与相机
保证屏幕旋转时比例正常
- 设置相机格式 onDrawFrame
Matrix.setLookAtM(viewMatrix, //接受相机变换矩阵
0, //变换矩阵的起始位置,偏移量
0,0,-3,//相机位置
0f,0f,0f,//观测点位置
0f,1.0f,0.0f//相机顶端方向
);
-设置投影格式 onSurfaceChanged
Matrix.frustumM(projectionMatrix ,//接受投影的矩阵,可以理解为投影的位置设置
0, //变换矩阵的起始位置(偏移量)
-ratio,ratio,-1,1,//相对观察点的左右下上四个方向距离
3,7 //相对观察点的近面与远面距离
);
- 相机与投影矩阵相乘,得到变换时的数据样版
Matrix.multiplyMM(vPMatrix,0,projectionMatrix,0,viewMatrix,0);
mTriangle.draw(vPMatrix);
- 获取句柄,进行渲染
vPMatrixHanle = GLES20.glGetUniformLocation(mProgram,"uMVPMatrix");
GLES20.glUniformMatrix4fv(vPMatrixHanle,1,false,mvpMatrix,0);
本博文纯粹记录,本身为菜鸟,如有不对,欢迎指正。
上一篇: Android注册广播的两种方法分析