OpenGL ES 的主要使用流程,可以概括如下:
在 Android 中,使用 OpenGL 最简单的办法便是使用官方提供的 GLSurfaceView 组件。其功能主要有:
- 管理一个 surface,这个 surface 就是一块特殊的内存,能直接排版到 android 的视图 view 上。
- 管理一个 EGL display,它能让 opengl 把内容渲染到上述的 surface 上。
- 用户可以自定义渲染器(render)。
- 让渲染器在独立的线程里运作,和 UI 线程分离。传统的 View 及其实现类,渲染等工作都是在主线程上完成的。
- 支持按需渲染(on-demand)和连续渲染(continuous)。
创建GLSurfaceView和render,并绑定
1 | //新建GLSurfaceView实例 |
1 | public class MyRenderer implements GLSurfaceView.Renderer { |
里面主要有3个方法:
onSurfaceCreated:它是在Surface创建的时候调用,可以在这里进行一些初始化操作,它携带两个参数GL10 和 EGLConfig。
1.通过setRenderMode设置渲染模式,有两种供选择
1 | - GLSurfaceView.RENDERMODE_CONTINUOUSLY 不间断的绘制,默认渲染模式是这种 |
2.调用gl.glClearColor(0f, 1f, 0f, 0f)设置清屏颜色为绿色,所谓清屏颜色就是当开始绘制时,屏幕所显示的颜色。glClearColor(float red, float green, float blue, float alpha)四个参数对应红、绿、蓝、透明度。这里的取值范围是0到1f。
1 | - GL10 继承自GL的一个接口,封装了程序语言为OpenGL绑定的核心功能,我们可以把它理解为一个“画笔”,操作它提供的的方法来在GLSurfaceView上这块“画布”绘制 |
onSurfaceChanged:
它是在Surface大小改变的时候调用,这个方法只会执行一次,Surface创建时初始大小为0,所以需要指定窗口大小,调用glViewport(int x, int y, int width, int height)方法传入四个参数,x,y坐标和宽高。
这里要注意一点,这个窗口坐标原点是位于屏幕左下角,与android中的屏幕坐标系不一样。
glViewport的理解:可以这样理解这个方法。前两个参数是原点,单位是像素,(0,0)的话就在屏幕的左下角。后两个是截取的大小。当截取出这样一个绘制区域之后,绘制时,绘制的坐标轴会在绘制区域的中心,且中心与左边的距离为-1,与右边的距离为1。比如截取一块整个屏幕大小的绘制区域,且在其(0,0)点绘制一个点,那个就刚好在屏幕中点绘制了一个点。
onDrawFrame:它是在Surface上绘制的时候调用。
调用glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除屏幕颜色,执行这个方法之后,屏幕就会渲染之前通过glClearColor设置的清屏颜色.如下图所示
如果设置渲染模式为GLSurfaceView.RENDERMODE_CONTINUOUSLY那么onDrawFrame方法会一直执行。