[Android实例] Android OpenGl初学分享

前几天有人为你OpenGl该如何做?没人解答,当然我就要出马啦~
不过,还是建议大家有问题先用一下“站内搜索”。你会发现更多的好东西!先推荐大家看这个,里面有从简单到复杂的各种画法!
http://www.eoeandroid.com/viewthread.php?tid=3561&highlight=opengl


那我就说说的了,我以前重来没有接触过OpenGL所以难免有错误。有什么错误大家指出来,一面误导大家。

首先是先把Dev Guide翻译了一下:
    1.summary:

通过OpenGL API,Android包含对高性能3D图形的支持 — 具体而言,是指OpenGL ES API 。
OpenGL ES 是根据 OpenGL 规范进行裁剪后定制而形成的一套标准,针对嵌入式设备而设计。 各版本 的 OpenGL ES 都广泛地向主要的OpenGL 标准看齐。目前,Android 支持 OpenGL ES 1.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分离了出来。

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


我是这样理解的:Android提供了画布,而OpenGL是画笔,我现在会用画布,但是我不会用画笔,所以,我也只能copy人家的OpenGL操作了。以后有机会还是我还是可以好好研究OpenGL。

在补充点我匆忙中翻译 GLSurfaceView的Reference:(ps:英语水平超烂,大家见谅啊,但希望能对大家有点用处)


summary:
一个SurfaceView的实现,用专门surface供显示OpenGL的描绘   
          它提供例如下面一个特性:   
   
  •       
  •         管理一个surface,它是一个特殊的内存能被混合到Android的view System。
  •         管理EGL显示,能让OpenGL描绘到一个surface中。
  •         接收用户提供的描绘器对象,来做实际的描绘。
  •         在一个专门的线程上进行描绘工作,从UI线程上减少翻译的表现。
  •         支持询问式和连续的描绘。
  •         任选,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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值