Android OpenGL 學習筆記

weixin_34247155發表於2016-02-25

什麼是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 列表

  1. GL
  2. GL 10
  3. GL 10 EXT
  4. GL 11
  5. GL 11 EXT
  6. GL 11 ExtensionPack

我們將使用 GL10 這個類開始接觸 OpenGL ,探索3D 領域。

GLSurfaceView

GLSurfaceView是Android應用程式中實現OpenGl畫圖的重要組成部分。GLSurfaceView中封裝了一個Surface。而android平臺下關於影象的現實,差不多都是由Surface來實現的。

Renderer

有了GLSurfaceView之後,就相當於我們有了畫圖的紙。現在我們所需要做的就是如何在這張紙上畫圖。所以我們需要一支筆。
Renderer是GLSurfaceView的內部靜態介面,它就相當於在此GLSurfaceView上作畫的筆。我們通過實現這個介面來“作畫”。最後通過GLSurfaceView的setRenderer(GLSurfaceView.Renderer renderer)方法,就可以將紙筆關聯起來了。
實現Renderer需要實現它的三個介面:onSurfaceCreated(GL10 gl, EGLConfig config)、 onSurfaceChanged(GL10 gl, int width, int height)、onDrawFrame(GL10 gl)。下面就這三個介面的具體意義做個簡單的介紹。
  1. onSurfaceCreated

此方法看名字就知道它是在Surface建立的時候被呼叫的。因此我們可以在這個函式的實現中做一些初始 化的工作。例如取出文房四寶、鋪好畫布、調好顏料之類的。它的函式原型如下:public abstract void onSurfaceCreated (GL10 gl, EGLConfig config)第二個引數在文件中沒有關於它的任何public方法和域。因此我們可以不用管它。第一個引數非常重要。如果說Renderer是畫筆的話,那麼這個gl引數,就可以說是我們的手了。如何操作這支畫筆,都是它說了算!所以我們絕大部分時候都是通過這個叫做gl的手來指揮Renderer畫圖的。

  1. onSurfaceChanged

當GLSurfaceView大小改變時,對應的Surface大小也會改變。值得注意的是,在Surface剛建立的時候,它的size其實是0,也就是說在畫第一次圖之前它也會被呼叫一次的。(而且對於很多時候,Surface的大小是不會改變的,那麼此函式就只在建立之初被呼叫一次而已)
原型如下:
public abstract void onSurfaceChanged (GL10 gl, int width, int height)
同樣的,畫圖的手是必需的。
另外值得注意的是,它告訴了我們這張紙有多高多寬。這點很重要。因為在onSurfaceCreated的時候我們是不知道紙的寬高的,所以有一些和長寬相關的初始化工作還得在此函式中來做。

  1. 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) 很簡單,只有手。

參考文件1
參考文件2
參考文件3

github專案地址

相關文章