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.Renderer
:view.setRenderer(renderer)
。
GLSurfaceView.Renderer
是一个接口,要实现这个接口需要实现三个方法:
这三个方法的调用时机:
onSurfaceCreated 是 GLSurfaceView 被创建时,调用线程是 GL 线程;
onSurfaceChanged 是 GLSurfaceVIew 大小发生改变时,比如收到虚拟按键隐藏显示等影响导致大小发生改变;
onDrawFrame 是真正的执行,GLSurfaceView 可以通过
setRenderMode
设置渲染模式,有两种渲染模式:RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染,只有 surface 被创建时或者我们主动调用
requestRender
时才会触发onDrawFrame
方法回调;RENDERMODE_CONTINUOUSLY:持续渲染,GL 线程会持续的调用
onDrawFrame
进行绘制。
接下来我们实现这三个接口就可以进行具体绘制了。
3、绘制步骤
3.1 onSurfaceCreated
在onSurfaceCreate
中做一些一次性操作:
设置清屏色:
gl.glClearColor(0f, 0f, 0f, 1f);
,代表整个背景的颜色,最小 0,最大 1,四个参数分别代表 R、G、B、A 分量;启用顶点缓存:
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
,glEnableClientState 和 glDisableClientState 启用或禁用单个客户端功能。默认情况下,禁用所有客户端功能,我们这里会用到顶点缓存,所以需要手动开启。
3.2 onSurfaceChanged
onSurfaceChange
回调时拿到了实际渲染窗口大小,可以:
设置视口大小:
gl.glViewport(0, 0, width, height);
设置投影矩阵:
设置投影矩阵:
gl.glMatrixMode(GL10.GL_PROJECTION);
加载单位矩阵,重置投影矩阵:
gl.glLoadIdentity();
设置平截头体:
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);
,前四个参数代表近平面(左右下上),后面两个参数分别代表近平面 Z 坐标值。
3.3 onDrawFrame
每次绘制时我们要做一些事情:
清除颜色缓冲区和深度缓冲区:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
加载模型视图矩阵:
gl.glMatrixMode(GL10.GL_MODELVIEW);
加载单位矩阵,重置模型视图矩阵:
gl.glLoadIdentity();
设置摄像机/眼睛坐标:
GLU.gluLookAt(gl, 0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
分别代表摄像机 XYZ 坐标、朝向 XYZ 坐标、朝上 XYZ 坐标设置绘制颜色:
gl.glColor4f(1f, 0f, 0f, 1f);
,这里我们设置为红色设置三角形顶点集合:
gl.glVertexPointer(3, GL10.GL_FLOAT, 0,buffer);
,第一个参数代表每个点多少个 type,第二个参数代表每个点表达数据类型,第三个参数步幅,这里是 0,buffer 是 java.nio.Buffer,存放顶点坐标数据绘制三角形:
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
3.4 效果展示
用到的顶点坐标:
4、总结
本文介绍了 Android 系统提供的 GLSurfaceView 的用法及绘制一个最基本的图像:三角形用到的 API:设置清屏色、启用顶点缓存、设置视口、设置投影矩阵等。
版权声明: 本文为 InfoQ 作者【轻口味】的原创文章。
原文链接:【http://xie.infoq.cn/article/f305099d71e579462724aaa4b】。文章转载请联系作者。
评论