OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的,1.1完全兼容1.0。OpenGL ES 2.0 则是参照 OpenGL 2.0 规范定义的。简单的来说,OpenGL ES是OpenGL针对嵌入式应用的简化版,也就是android使用的标准。OpenGL ES 1.1强调api的硬件加速,OpenGL ES 2.0更强调3D能力。
OpenGL ES 1.1和OpenGL ES 2.0之间的关系并不是旧版本和新版本之间的差别,而是一个针对相对低端的应用,一个针对高级应用,OpenGL官方的roadmap也是将这两个版本并行发展的。2.X并不能百分百兼容1.X。
Android现在支持1.X和2.X。
android上opengs开发有两种方式,
1. 通过android framework 提供的接口开发
2. 通过android ndk 开发
首先看通过framework提供的java接口开发方式:
android framework层通过两个类提供opengs es开发基础,
类GLSurfaceView和GLSurfaceView.Renderer接口,
GLSurfaceView 是一个view,继承了surfaceview,surfaceview的一个重要用法是你可以单独开启线程在屏幕上渲染图像,而不像其他基于view的控件都属于ui线程。
GLSurfaceView 给opengls es 绘制线程提供surface,当创建一个glsurfaceview并绑定到到activity时需要注册在此surfaceview上渲染的Renderer对象, 通过调用setRenderer(Renderer) 完成注册,setRenderer调用时会创建绘制线程,此线程会根据ui事件及surface窗口的改变回调
GLSurfaceView.Renderer 接口的回调方法,真正的绘制动作都在此接口的回调方法里实现,接口方法包括:
//绘制帧数据
abstract void
onDrawFrame(GL10 gl)
//当surface大小改变时被调用
abstract void
onSurfaceChanged(GL10 gl, int width, int height)
//当surface被创建时 调用,这里可以作初始化动作。
abstract void
onSurfaceCreated(GL10 gl, EGLConfig config)
所以openggl es开发通常是实现这几个接口,然后 调用setRenderer(Renderer)把 此接口注册给GLSurfaceView。
调用setRenderer(Renderer)会把Renderer对象传给绘制线程,绘制线程操作此对象,当ui线程想和绘制线程通信时可以采用java提供的线程间通信方法,也可以用GLSurfaceView 提供的queueEvent(Runnable),因为输入事件都属于ui线程,所以
如果想通过输入事件控制绘制线程queueEvent是个不错的选择。
Class Overview
java.lang.Object
↳
android.view.View
↳
android.view.SurfaceView
↳
android.opengl.GLSurfaceView