找回密码
 立即注册
查看: 4546|回复: 79

[手机] Android OpenGL分享心得

[复制链接]
发表于 2013-2-1 00:26 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Android OpenGL分享心得(发帖教程)
适用引擎:   (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线
这是网友初学Android OpenGL的一些心得,在这里和大家一起分享,希望对初学OpenGL的开发者有所帮助。这篇教程主要是一些理论的讲解,可以让你初步了解Android OpenGL的开发。

  首先是先把Dev Guide翻译了一下:
  1.summary:
  通过OpenGL API,Android包含对高性能3D图形的支持 — 具体而言,是指OpenGL ES API 。OpenGL ES 是根据OpenGL规范进行裁剪后定制而形成的一套标准,针对嵌入式设备而设计。各版本的OpenGL ES都广泛地向主要的OpenGL标准看齐。目前,Android支持OpenGL ES1.0,即相当于OpenGL 1.3。换言之,假设你的应用程序能够在桌面系统上结合OpenGL 1.3运行,那么它亦将能够运行在Android上。Android提供的这一API类似于J2ME中的OpenGL ES API(JSR 239)。然而,有可能并非完全一致;因此,对一些偏差要多加留意。

  2.Using the API
  这里给出一个比较抽象的使用API的步骤:
  1.编写一个自定义的 View 子类。
  2.取得一个OpenGLContext句柄,以便使用 OpenGL 提供的那些功能。
  3.在View 类的 onDraw() 方法里,取得一个指向GL对象的句柄,并调用它所提供的一些方法来执 行GL操作。

  3.参考
  ApiDemo中的com.android.samples.graphics.GLSurfaceViewActivity.java可以做很好的参考。当然也不能忘记看文档哦。

  接下来就是例子了,其实,我就是把apidemo中的GLSurfaceViewActivity分离了出来。

  注意一下几点:
  1.OpenGL有自己的Surface --> GLSurfaceView
  2.GLSurfaceView需要你注册一个Renderder,它是GLSurfaceView.Renderer接口,一般来说多是自己实现的,例如里中的SimpleRenderer。
  3.注意例子中的Activity的setContentView(mGLSurfaceView);是GLSurfaceView类型。

  summary:
  一个SurfaceView的实现,用专门surface供显示OpenGL的描绘,它提供例如下面一个特性:
  1.管理一个surface,它是一个特殊的内存能被混合到Android的view System。
  2.管理EGL显示,能让OpenGL描绘到一个surface中。
  3.接收用户提供的描绘器对象,来做实际的描绘。
  4.在一个专门的线程上进行描绘工作,从UI线程上减少翻译的表现。
  5.支持询问式和连续的描绘。
  6.任选,wraps,trace或者error-check 描绘器的的OpenGL调用。

  Using GLSurfaceView
  通常通过继承使用GLSurfaceView,并重载一个或多个View System input event方法。如果你的应用不需要重载事件方法,那么GLSurfaceView能被用作as-is关系。对于大部分的GLSurfaceView的行为是通过set方法进行客制化的,而不是通过继承。例如:不像一个正常的View,drawing被托付给一个分离的绘画器对象,这个对象是通过调用setRenderer方法注册的。

  Initializing GLSurfaceView
  Summary
  GLSurfaceView的初始化就是setRenderer。然后,如果你需要,你可以在调用setRenderer之前,通过下面中的一个或者多个方法修改GLSurfaceView的默认行为:   
  * setDebugFlags(int)     
  * setEGLConfigChooser(boolean)
  * setEGLConfigChooser(EGLConfigChooser)     
  * setEGLConfigChooser(int, int, int, int, int, int)     
  * setGLWrapper(GLWrapper)   

  Choosing an EGL Configuration
  一个Anroid设备可能支持多种类型的Surface。这些可用的Surface的区别可能是数据显示了多少个channel,每一个channel分配了多少个bit。因此,在开始绘画前,GLSurfaceView的第一件不得不做的事是使用那种Surface。   

  默认GLSurfaceView选择一个最接近16-bit R5G6B5的Surface,拥有一个16-bit depth的buffer,没有模板(no stencil)。如果你更喜欢一个不同的Surface(例如,你不需要depth buffer)你能通过setEGLConfigChooser方法覆盖默认的行为。

  Debug Behavior
  你能通过一个或多个调试方法改变GLSurfaceView的行为。这些方法在setRenderer方法前后都可以,一般在调用setRenderer之前,这样能马上生效。那几个方法就自己去看Reference了。

  Setting a Renderer
  最后你必须调用setRenderer方法注册一个GLSurfaceView.Renderer。这个绘画器负责OpenGL实际的绘画。

  Rendering Mode     
  一旦绘画器设置了,你能控制这个绘画器连续的画或者询问式的画。默认是连续的画。

  Activity Life-cycle     
  一个GLSurfaceView必须在Activity停止和恢复时被通知。在Activity停止和恢复时,GLSurfaceView客户端需要调用onPause()和onResume()方法。这些方法允许GLSurfaceView停止和恢复绘画线程,并也GLSurfaceView释放和重建OpenGL显示。

  Handling events
  为了处理事件,你通常需要继承GLSurfaceView并覆盖适当的方法,就像你对其他view的一样。然而,当处理事件时,你可能需要与绘画线程中的绘画器通信。你能用任何Java标准的跨线程机制。另外,一个简单的方式是通过queueEvent(Runnable方法。例子将Reference了 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2013-9-25 11:25 | 显示全部楼层
感谢lz分享
发表于 2016-12-6 16:47 | 显示全部楼层
:[code=csharp])[quote][/quote][/code]
发表于 2017-3-7 18:54 | 显示全部楼层
好帖就是要顶
发表于 2017-3-7 18:54 | 显示全部楼层
顶顶多好
发表于 2017-3-7 18:47 | 显示全部楼层
难得一见的好帖
发表于 2017-3-7 18:43 | 显示全部楼层
很好哦
发表于 2017-3-7 18:57 | 显示全部楼层
不错不错
发表于 2017-4-9 12:50 | 显示全部楼层
楼主是超人
发表于 2017-4-9 13:08 | 显示全部楼层
好帖就是要顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-19 20:18 , Processed in 0.106627 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表