您的位置:首页 > 移动开发 > Android开发

android opengl 原理及开发(1)

2012-03-29 16:50 253 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息