写点什么

OpenGL 入门二:绘制三角形

作者:轻口味
  • 2023-04-30
    山西
  • 本文字数:1568 字

    阅读完需:约 5 分钟

OpenGL入门二:绘制三角形

1、背景

本文我们基于最基础,最简单的 OpenGL API,最终实现三角形的绘制(基于 OpenGL 1.0 Java 接口)。本文只对 OpenGL 相关接口使用进行介绍,深入原理后续逐步剖析。

2、Android OpenGL 环境搭建

Android 为我们提供了 SurfaceView,可以在一个新启的单独线程中可以重新绘制画面,GLSurfaceView 在 SurfaceView 的基础上绑定了 OpenGL 相关环境。工作中我们用到这两个控件主要是播放视频,预览摄像头画面,今天我们使用 GLSurfaceView 调用 OpenGL 相关接口进行绘制。


首先,GLSurfaceView 的创建和普通 View 没区别:GLSurfaceView view = new GlSurfaceView(context);


接着,我们需要为 GLSurfaceView 设置渲染器GLSurfaceView.Rendererview.setRenderer(renderer)


GLSurfaceView.Renderer是一个接口,要实现这个接口需要实现三个方法:


public class MyRenderer implements GLSurfaceView.Renderer {    @Override  public void onSurfaceCreated(GL10 gl, EGLConfig config) {    }  @Override  public void onSurfaceChanged(GL10 gl, int width, int height) {      }@Override  public void onDrawFrame(GL10 gl) {  }
复制代码


这三个方法的调用时机:


  1. onSurfaceCreated 是 GLSurfaceView 被创建时,调用线程是 GL 线程;

  2. onSurfaceChanged 是 GLSurfaceVIew 大小发生改变时,比如收到虚拟按键隐藏显示等影响导致大小发生改变;

  3. onDrawFrame 是真正的执行,GLSurfaceView 可以通过setRenderMode设置渲染模式,有两种渲染模式:

  4. RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染,只有 surface 被创建时或者我们主动调用requestRender时才会触发onDrawFrame方法回调;

  5. RENDERMODE_CONTINUOUSLY:持续渲染,GL 线程会持续的调用onDrawFrame进行绘制。


接下来我们实现这三个接口就可以进行具体绘制了。

3、绘制步骤

3.1 onSurfaceCreated

onSurfaceCreate中做一些一次性操作:


  1. 设置清屏色:gl.glClearColor(0f, 0f, 0f, 1f);,代表整个背景的颜色,最小 0,最大 1,四个参数分别代表 R、G、B、A 分量;

  2. 启用顶点缓存:gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);,glEnableClientState 和 glDisableClientState 启用或禁用单个客户端功能。默认情况下,禁用所有客户端功能,我们这里会用到顶点缓存,所以需要手动开启。

3.2 onSurfaceChanged

onSurfaceChange回调时拿到了实际渲染窗口大小,可以:


  1. 设置视口大小:gl.glViewport(0, 0, width, height);

  2. 设置投影矩阵:

  3. 设置投影矩阵:gl.glMatrixMode(GL10.GL_PROJECTION);

  4. 加载单位矩阵,重置投影矩阵:gl.glLoadIdentity();

  5. 设置平截头体:gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);,前四个参数代表近平面(左右下上),后面两个参数分别代表近平面 Z 坐标值。

3.3 onDrawFrame

每次绘制时我们要做一些事情:


  1. 清除颜色缓冲区和深度缓冲区:gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

  2. 加载模型视图矩阵:gl.glMatrixMode(GL10.GL_MODELVIEW);

  3. 加载单位矩阵,重置模型视图矩阵:gl.glLoadIdentity();

  4. 设置摄像机/眼睛坐标:GLU.gluLookAt(gl, 0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);分别代表摄像机 XYZ 坐标、朝向 XYZ 坐标、朝上 XYZ 坐标

  5. 设置绘制颜色:gl.glColor4f(1f, 0f, 0f, 1f);,这里我们设置为红色

  6. 设置三角形顶点集合:gl.glVertexPointer(3, GL10.GL_FLOAT, 0,buffer);,第一个参数代表每个点多少个 type,第二个参数代表每个点表达数据类型,第三个参数步幅,这里是 0,buffer 是 java.nio.Buffer,存放顶点坐标数据

  7. 绘制三角形:gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

3.4 效果展示

用到的顶点坐标:


float[] vertexCoords = {        0.2f,0f,0f,        0.6f,0f,0f,        0.4f,0.5f,0f}
复制代码



4、总结

本文介绍了 Android 系统提供的 GLSurfaceView 的用法及绘制一个最基本的图像:三角形用到的 API:设置清屏色、启用顶点缓存、设置视口、设置投影矩阵等。

发布于: 刚刚阅读数: 3
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017-10-17 加入

Android、音视频、AI相关领域从业者。 欢迎加我微信wodekouwei拉您进InfoQ音视频沟通群 邮箱:qingkouwei@gmail.com

评论

发布
暂无评论
OpenGL入门二:绘制三角形_opengl_轻口味_InfoQ写作社区