OpenGL ES之Android平台实现图形绘制一

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 绘制区域。
OpenGL ES之Android平台实现图形绘制一

常用方法

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

绘制模型


  1. 1)GL_POINTS
    2)glPointSize 设置点的大小
  2. 线
    1)GL_LINE_LOOP 依次连接 封口
    OpenGL ES之Android平台实现图形绘制一
    2)GL_LINE_STRIP 依次连接不封口
    OpenGL ES之Android平台实现图形绘制一
    3)GL_LINES 按顺序 两两一组连线
    OpenGL ES之Android平台实现图形绘制一
  3. 三角形
    1)GL_TRIANGLES 依次三个点 组成三角形 点不重复用
    OpenGL ES之Android平台实现图形绘制一
    2)GL_TRIANGLE_STRIP 依次连三个点 每次第三个点都重复用,作为下一个三角形的起始

OpenGL ES之Android平台实现图形绘制一
3)GL_TRIANGLE_FAN 固定一个点不动,依次连接其他两个做成三角形
OpenGL ES之Android平台实现图形绘制一

实现步骤

  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)同步生命周期