关闭

android opengl 原理及开发(1)

标签: androiduijava嵌入式classapi
2396人阅读 评论(0) 收藏 举报
分类:


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





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1649023次
    • 积分:23339
    • 等级:
    • 排名:第284名
    • 原创:671篇
    • 转载:72篇
    • 译文:7篇
    • 评论:298条
    博客专栏
    最新评论
    database
    voip