OpenGl ES Java实现图形绘制

项目地址

https://github.com/rocky123shine/Rocky_Study_Open_GL_ES180310

渲染器 Renderer

OpenGL提供的Renderer 是一个接口。该接口提供了监听Surface变化的三个方法。
1. onSurfaceCreated
2. onSurfaceChanged
3. onDrawFrame
这三个方法伴随着Surface的创建、改变和帧的绘制。

渲染模式

  1. 主动渲染(RENDERMODE_CONTINUOUSLY )
    主动渲染是指系统每隔一段时间自动渲染,因此消耗手机性能
  2. 被动渲染(RENDERMODE_WHEN_DIRTY)
    被动渲染,顾名思义,指需要时手动渲染,相对主动消耗性能少,但需要手动调用requestRender()刷新View
  3. 设置渲染模式
    setRenderMode(RENDERMODE_CONTINUOUSLY);//此为主动渲染

视口

视口即是OpenGL ES 绘制区域。

Android GLES20渲染高清 安卓图形渲染_渲染器

常用方法

  • 开启某个功能 glEnable
  • 关闭某个功能 glDisable
  • 清除缓存 glClear
  • 清楚背景颜色 glClearColor

绘制模型


  1. 1)GL_POINTS
    2)glPointSize 设置点的大小
  2. 线
    1)GL_LINE_LOOP 依次连接 封口

    2)GL_LINE_STRIP 依次连接不封口

    3)GL_LINES 按顺序 两两一组连线
  3. 三角形
    1)GL_TRIANGLES 依次三个点 组成三角形 点不重复用

    2)GL_TRIANGLE_STRIP 依次连三个点 每次第三个点都重复用,作为下一个三角形的起始

Android GLES20渲染高清 安卓图形渲染_渲染器_02


3)GL_TRIANGLE_FAN 固定一个点不动,依次连接其他两个做成三角形

Android GLES20渲染高清 安卓图形渲染_自定义_03

实现步骤

  1. 自定义SurfaceView
    1)自定义SurfaceView 继承自GLSurfaceView
    2)复写构造法
  2. 初始化渲染器
    1)写一个类实现Renderer接口
    2)实现三个方法
    3)设置渲染器,把实现Renderer接口的类的对象放到setRenderer(对象);
    4)设置渲染模式
  3. 重写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)同步生命周期