什么是OpenGL
OpenGL是一個專業的3D程序接口,OpenGL 的前身是 SGI 公司為其圖形工作站開的 IRIS GL。IRIS GL 是一個工業標準的3D圖形軟件接口,功能雖然強大但是移植性不好,于是 SGI 公司便在 IRIS GL 的基礎上開發OpenGL
具體詳細的介紹請 點擊這里
Android OpenGL ES 簡介
Android系統使用 OpenGL 的標準接口來支持3D圖形功能,android 3D 圖形系統也分為 java 框架和本地代 碼兩部分。本地代碼主要實現的 OpenGL接口的庫,在 Java 框架層, javax.microedition.khronos.opengles 是 java 標準的 OpenGL包,android.opengl包提供了OpenGL系統和 Android GUI 系統之間的聯系。
Android 支持 OpenGL 列表
- GL
- GL 10
- GL 10 EXT
- GL 11
- GL 11 EXT
- GL 11 ExtensionPack
我們將使用 GL10 這個類開始接觸 OpenGL ,探索3D 領域。
GLSurfaceView
GLSurfaceView是Android應用程序中實現OpenGl畫圖的重要組成部分。GLSurfaceView中封裝了一個Surface。而android平臺下關于圖像的現實,差不多都是由Surface來實現的。
Renderer
有了GLSurfaceView之后,就相當于我們有了畫圖的紙?,F在我們所需要做的就是如何在這張紙上畫圖。所以我們需要一支筆。
Renderer是GLSurfaceView的內部靜態接口,它就相當于在此GLSurfaceView上作畫的筆。我們通過實現這個接口來“作畫”。最后通過GLSurfaceView的setRenderer(GLSurfaceView.Renderer renderer)方法,就可以將紙筆關聯起來了。
實現Renderer需要實現它的三個接口:onSurfaceCreated(GL10 gl, EGLConfig config)、 onSurfaceChanged(GL10 gl, int width, int height)、onDrawFrame(GL10 gl)。下面就這三個接口的具體意義做個簡單的介紹。
- onSurfaceCreated
此方法看名字就知道它是在Surface創建的時候被調用的。因此我們可以在這個函數的實現中做一些初始 化的工作。例如取出文房四寶、鋪好畫布、調好顏料之類的。它的函數原型如下:public abstract void onSurfaceCreated (GL10 gl, EGLConfig config)第二個參數在文檔中沒有關于它的任何public方法和域。因此我們可以不用管它。第一個參數非常重要。如果說Renderer是畫筆的話,那么這個gl參數,就可以說是我們的手了。如何操作這支畫筆,都是它說了算!所以我們絕大部分時候都是通過這個叫做gl的手來指揮Renderer畫圖的。
- onSurfaceChanged
當GLSurfaceView大小改變時,對應的Surface大小也會改變。值得注意的是,在Surface剛創建的時候,它的size其實是0,也就是說在畫第一次圖之前它也會被調用一次的。(而且對于很多時候,Surface的大小是不會改變的,那么此函數就只在創建之初被調用一次而已)
原型如下:
public abstract void onSurfaceChanged (GL10 gl, int width, int height)
同樣的,畫圖的手是必需的。
另外值得注意的是,它告訴了我們這張紙有多高多寬。這點很重要。因為在onSurfaceCreated的時候我們是不知道紙的寬高的,所以有一些和長寬相關的初始化工作還得在此函數中來做。
- onDrawFrame
好了,我們的初始化工作做得差不多了,那么現在就是該真刀真槍畫畫的時候了!此函數就是真正給你畫畫用的。每調用一次就畫一幅圖??赡艿囊蓡柺沁@個函數什么時候會被調
用呢?最開始的時候肯定是會被調用的。以后會有兩種模式供你選擇:
RENDERMODE_CONTINUOUSLY
RENDERMODE_WHEN_DIRTY
第一種模式(RENDERMODE_CONTINUOUSLY):
連續不斷的刷,畫完一幅圖馬上又畫下一幅。這種模式很明顯是用來畫動畫的;
第二種模式(RENDERMODE_WHEN_DIRTY):
只有在需要重畫的時候才畫下一幅。這種模式就比較節約CPU和GPU一些,適合用來畫不經常需要刷新的情況。多說一句,系統如何知道需要重畫了呢?當然是你要告訴它……
調用GLSurfaceView的requestRender ()方法,告訴它,你臟了。
這兩種模式在什么地方設置呢? GLSurfaceView的setRenderMode(int renderMode)方法。可以供你設置你需要的刷新模式。
還是來看看這個函數的原型吧: public abstract void onDrawFrame (GL10 gl) 很簡單,只有手。