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 列表

  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之后,就相當于我們有了畫圖的紙?,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)。下面就這三個接口的具體意義做個簡單的介紹。
  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項目地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容