OpenGl ES Java实现图形绘制
项目地址
https://github.com/rocky123shine/Rocky_Study_Open_GL_ES180310
渲染器 Renderer
OpenGL提供的Renderer 是一个接口。该接口提供了监听Surface变化的三个方法。
1. onSurfaceCreated
2. onSurfaceChanged
3. onDrawFrame
这三个方法伴随着Surface的创建、改变和帧的绘制。
渲染模式
- 主动渲染(RENDERMODE_CONTINUOUSLY )
主动渲染是指系统每隔一段时间自动渲染,因此消耗手机性能 - 被动渲染(RENDERMODE_WHEN_DIRTY)
被动渲染,顾名思义,指需要时手动渲染,相对主动消耗性能少,但需要手动调用requestRender()刷新View - 设置渲染模式
setRenderMode(RENDERMODE_CONTINUOUSLY);//此为主动渲染
视口
视口即是OpenGL ES 绘制区域。
常用方法
- 开启某个功能 glEnable
- 关闭某个功能 glDisable
- 清除缓存 glClear
- 清楚背景颜色 glClearColor
绘制模型
- 点
1)GL_POINTS
2)glPointSize 设置点的大小 - 线
1)GL_LINE_LOOP 依次连接 封口
2)GL_LINE_STRIP 依次连接不封口
3)GL_LINES 按顺序 两两一组连线 - 三角形
1)GL_TRIANGLES 依次三个点 组成三角形 点不重复用
2)GL_TRIANGLE_STRIP 依次连三个点 每次第三个点都重复用,作为下一个三角形的起始
3)GL_TRIANGLE_FAN 固定一个点不动,依次连接其他两个做成三角形
实现步骤
- 自定义SurfaceView
1)自定义SurfaceView 继承自GLSurfaceView
2)复写构造法 - 初始化渲染器
1)写一个类实现Renderer接口
2)实现三个方法
3)设置渲染器,把实现Renderer接口的类的对象放到setRenderer(对象);
4)设置渲染模式 - 重写Renderer的三个方法 1)onSurfaceCreated重写 关闭抗抖动 - gl.glDisable(GL10.GL_DITHER); 设置快速修正 - gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST); 设置背景颜色 - gl.glClearColor(0,0,0,0); 开启深度测试 - gl.glEnable(GL10.GL_DEPTH_TEST); 2)onSurfaceChanged重写 设置视口 - gl.glViewport(0,0,width,height); 设置投影矩阵 - gl.glMatrixMode(GL10.GL_PROJECTION); 设置正交投影 - gl.glLoadIdentity(); 计算屏幕宽高比 - float r = (float) width / height; 设置进远平面 - gl.glFrustumf(-r,r,-1,1,1,10); 3)onDrawFrame重写 清除缓存 - gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 设置矩阵模型 - gl.glMatrixMode(GL10.GL_MODELVIEW); 设置投影类型 - gl.glLoadIdentity(); 启用顶点坐标数组 - gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 启用顶颜色数组 - gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
//设置画笔
//为画笔指定顶点数据
/**
* 参数1坐标个数
* 参数2顶点数据类型
* 参数3 连续顶点坐标数据的间隔
* 参数4顶点数缓冲
*/
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verBuffer);
//为花大笔指定顶点颜色数据
//同上
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
gl.glPointSize(10);
/**
* 参数1 绘制模型 点 线段 三角形
*2 数组缓存开始的位置
* 3 顶部观点个数
*/
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,vCount);1. 在Activity中
1)setContentView(自定义SurfaceView对象)
2)同步生命周期