前几天有人为你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了