OpenGL ES
OpenGL ES API讓Android的繪圖能力大幅提昇,它繪圖與圖形處理的能力幾乎只受限於應用程式開發者的想像力;此外,它更能充分利用Android裝置所提供的圖形處理單元(GPU,Graphics Processing Unit),加速圖形處理的效率。
一、OpenGL與座標系統 OpenGL架構評審委員會(ARB)負責維護OpenGL的規範,目前最新版本(本書撰寫時)為2012年8月發表的OpenGL 4.3。 OpenGL對裝備硬體的需求很大,這需求一般已經超出一些嵌入式系統或行動裝置的規格,因此Khronos在2000年推出了專門用於嵌入式系統或行動裝置的OpenGL ES版本,其中ES表示(Embedded System),目前最新的版本是OpenGL ES 3.0。
Android系統從Android 1. 0開始支援OpenGL ES 1. 0與1. 1的API,而從android 2 Android系統從Android 1.0開始支援OpenGL ES 1.0與1.1的API,而從android 2.2(level 8)開始支援OpenGL ES 2.0。 對行動裝置而言,OpenGL定義的座標系統以水平軸為X軸(相對於裝置螢幕)、右向為軸的正向,以垂直為Y軸、軸的正向為向上,Z軸垂直於裝置螢幕、以離開螢幕方向為正。
二、OpenGL ES應用的主要類別 要在應用程式中透過OpenGL ES API建立或操作圖形,需要2個基本類別:「GLSurfaceView」類別與「GLSurfaceView.Renderer」介面。 GLSurfaceView 用以繪製或操作圖形的視圖,我們應該建立此類別的實體,並將從GLSurfaceView.Renderer介面實作的類別加入其中;如果要讓此視圖能與使用者互動,這個類別還必須實作觸控事件的偵聽器。
GLSurfaceView.Renderer 這介面定義了要在GLSurfaceView上繪圖所需要的方法;應用OpenGL ES時候,需要自建一個繼承此介面的子類別,並實作以下方法: onSurfaceCreated():當建立GLSurfaceView物件的時候,系統會自動呼叫此方法,一般利用此方法進行初始化的設定。 onSurfaceChanged():每一次要繪製或重繪GLSurfaceView物件,系統都會呼叫此方法,功能類似於View物件的onDraw()方法,這方法是執行圖形繪製的主要地方。 onDrawFrame():當GLSurfaceView物件大小或方位發生變化時,系統將呼叫此方法,一般利用此方法處理其內容如何對GLSurfaceView物件幾何變化產生的回應。
完成此自建類別之後,在應用程式的活動類別中,還需要透過GLSurfaceView實體物件的「setRenderer()」方法,將此類別(稱為描繪器)設定給使用的GLSurfaceView物件。
三、繪製平面形狀 OpenGL ES只支援繪製三角形,而任何形狀(平面或立體)都能由三角形構成。 三角形 因為OpenGL是以繪製3維圖形為主要目的,因此每一個點都有3個座標值,對於平面圖形只要將其Z軸座標設為固定就可以了。 OpenGL ES預設以GLSurfaceView影格的中心為原點,(1, 1, 0)為影格右上角,(-1, -1, 0)為影格左下角。形狀頂點座標定義要採反時鐘方向。
四邊形 四邊形以2個三角形組合而成。 除了要注意三角形本身頂點的順序為反時鐘順序以外,這2個三角形彼此之間的頂點順序也要注意。
投影 OpenGL預設GLSurfaceView為正方形,但在實際裝置中甚少有方形的顯示區域,因此繪出的圖形會因為顯示區域實際長寬比例而產生變形。 為了解決以上現象,OpenGL提出透視投影的觀點。 透視投影是依據GLSurfaceView的長寬比調整繪圖物件座標的一種轉換,一般會將此轉換置於「onSurfaceChanged()」方法中,這樣就能避免因螢幕方位變化而影響圖形的顯示。
要應用透視投影模式,必須先透過GL10物件的「glMatrixMode(GL10 要應用透視投影模式,必須先透過GL10物件的「glMatrixMode(GL10.GL_PROJECTION)」方法轉換成透視投影矩陣模式,再用最近、最遠可視範圍與視角,計算出視域的寬度與高度(高度可以從寬度推得),然後用「glFrustumf()」計算出透視投影矩陣。 OpenGLShape Test範例 範例詳細內容請參考原書。
四、3D圖形與動畫 OpenGL主要是用於繪製3D物體,而且它繪製的方法與平面形狀幾乎相同。 OpenGLCube Test範例 在場景上建立一個不斷繞自己Y軸旋轉的立方體。 範例詳細內容請參考原書。
五、用onTouch事件產生互動旋轉動畫 GLSurfaceView類別也提供有「onTouchEvent()」方法,只要覆寫這個方法,就能偵聽觸控事件,並依觸控類型設計互動的動作。 OpenGLInteractive Test範例 使用者用手在螢幕上水平(沿X軸)滑動,控制立方體沿Y 軸轉動方向。 範例詳細內容請參考原書。