Android OpenGL 學習筆記
什麼是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之後,就相當於我們有了畫圖的紙。現在我們所需要做的就是如何在這張紙上畫圖。所以我們需要一支筆。
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) 很簡單,只有手。
相關文章
- Android 學習筆記雜記Android筆記
- Android學習筆記·ANRAndroid筆記
- Android學習筆記·HandlerAndroid筆記
- Android學習筆記·ADBAndroid筆記
- Android學習筆記一Android筆記
- Android SQLite學習筆記AndroidSQLite筆記
- Android Linker學習筆記Android筆記
- Android Studio學習筆記Android筆記
- OpenGL筆記之一 開學筆記
- Android 學習筆記核心篇Android筆記
- Android Gradle 學習筆記整理AndroidGradle筆記
- Android 學習筆記思考篇Android筆記
- 2018.03.06 Android Handler學習筆記Android筆記
- Android 開發學習筆記Android筆記
- Android 學習筆記架構篇Android筆記架構
- React Native Android學習筆記 - 2015React NativeAndroid筆記
- 2018.03.16、Android-IntentService學習筆記AndroidIntent筆記
- Android環境搭建學習筆記Android筆記
- Android菜鳥學習js筆記一AndroidJS筆記
- Android卡頓優化學習筆記Android優化筆記
- 2018.03.30、Android-ObjectBox學習筆記1AndroidObject筆記
- Android 快取工具 DiskLruCache 學習筆記Android快取筆記
- Android學習筆記(建立Menu,Intent的使用)Android筆記Intent
- Android學習筆記-Activity的啟動模式Android筆記模式
- numpy的學習筆記\pandas學習筆記筆記
- Android學習筆記之build.gradle檔案Android筆記UIGradle
- OpenGL 學習 01 Mac 搭建 OpenGL 環境Mac
- 學習筆記筆記
- 《Android原始碼設計模式》學習筆記之ImageLoaderAndroid原始碼設計模式筆記
- [Android學習筆記]雜碎知識(持續更新)Android筆記
- OpenGL 學習 04 圖元
- 【學習筆記】數學筆記
- 《JAVA學習指南》學習筆記Java筆記
- 機器學習學習筆記機器學習筆記
- Android學習筆記--基於XMPP的即時通訊Android筆記
- Android Utils 之 Vector 學習筆記(一)—— VectorImpl 程式碼分析Android筆記
- Android學習過程的Cursor遊標填坑筆記Android筆記
- 學習筆記-粉筆980筆記
- 學習筆記(3.29)筆記