使用Android OpenGL ES 2.0繪圖之一:構建一個OpenGL ES環境

  為瞭能夠在Android應用程序中使用OpenGL ES繪制圖形,你必須創建一個視圖作為容器。而更直接的做法是從GLSurfaceView和 GLSurfaceView.Renderer各派生一個實現類。GLSurfaceView作為使用OpenGL繪制的容器,GLSurfaceView.Renderer將用於控制繪圖的動作。對這些類的更多信息,請參閱OpenGL ES開發人員指南。

        使用GLSurfaceView幾乎是整合OpenGL ES到你的應用中的唯一方式。對於一個需要全屏或近乎屏幕圖形視圖,它是一個合理的選擇。如果開發人員隻是期望借助OpenGL ES在某個佈局中一小部分繪圖,則應該考慮使用TextureView。如果覺得自己是“大牛”,完全可以使用SurfaceView建立一個OpenGL ES視圖,但這樣做需要編寫相當多的額外的代碼。
        這一節將介紹如何在一個簡單應用的activity中完成一個最小的GLSurfaceView和GLSurfaceView.Renderer的實現。
一、在Manifest文件中聲明使用OpenGL ES
        為瞭能夠使用OpenGL ES 2.0 API,你必須在manifest文件中添加以下聲明:
[html] 
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> 

<uses-feature android:glEsVersion="0x00020000" android:required="true" />        如果你的應用需要使用紋理壓縮功能,還要聲明設備需要支持什麼樣的壓縮格式:
[html] 
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> 
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" /> 

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />        更多關於紋理壓縮格式的信息,請參閱OpenGL開發人員指南。
二、為OpenGL ES圖形創建一個Activity
        這個Activity跟任何其他的應用程序中的Activity一樣,也有一個用戶界面。唯一的區別是在它的佈局文件中存放的視圖不是TextView、Button和ListView,而是一個GLSurfaceView。
        下面的代碼演示瞭使用GLSurfaceView作為主視圖的Acitivity的核心代碼:
[java
public class OpenGLES20 extends Activity { 
 
    private GLSurfaceView mGLView; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
 
        //創建一個GLSurfaceView對象,並將其設置為當前Activity的ContentView  
        mGLView = new MyGLSurfaceView(this); 
        setContentView(mGLView); 
    } 

public class OpenGLES20 extends Activity {

    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //創建一個GLSurfaceView對象,並將其設置為當前Activity的ContentView
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}        註:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本,所以請確保你的Android項目的運行目標的API等級不低於8或更高。
三、構造一個GLSurfaceView對象
        事實上GLSurfaceView並沒有提供很多功能,實際上繪制對象的任務都在GLSurfaceView.Renderer中進行。所以GLSurfaceView中代碼也非常少,甚至可以直接使用GLSurfaceView。但最好別這樣做,因為你需要擴展這個類來響應觸摸事件。
        通常在當前Activity中以內部類的方式創建GLSurfaceView,這樣實現起來非常快,核心代碼如下:
[java] 
class MyGLSurfaceView extends GLSurfaceView { 
 
    public MyGLSurfaceView(Context context){ 
        super(context); 
 
        //為瞭在GLSurfaceView中繪制圖形而設置Renderer  
        setRenderer(new MyRenderer()); 
    } 

class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context){
        super(context);

        //為瞭在GLSurfaceView中繪制圖形而設置Renderer
        setRenderer(new MyRenderer());
    }
}        當使用OpenGL ES 2.0時,你必須在GLSurfaceView構造器中調用另外一個方法,它指定瞭你將要使用2.0版的API:
[java] 
// 創建一個OpenGL ES 2.0 context  
setEGLContextClientVersion(2); 

// 創建一個OpenGL ES 2.0 context
setEGLContextClientVersion(2);        註:如果你使用的是OpenGL ES 2.0的API,那麼請確保在Manifest文件中作出相關API版本聲明。有關更多信息,請參見在Manifest文件中聲明使用OpenGL ES。
        另一個可以添加到你的GLSurfaceView中可選操作是設置渲染模式為僅當繪制數據發生改變時才繪制view。該渲染模式常量是GLSurfaceView.RENDERMODE_WHEN_DIRTY。
[java] 
// 隻有在繪制數據改變時才繪制view  
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 

// 隻有在繪制數據改變時才繪制view
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);        該設置可以防止GLSurfaceView幀重繪,直到調用requestRender()方法。這樣的繪制機制更高效。
四、構造一個Renderer類
        Renderer類負責控制在GLSurfaceView中繪制任務,並提供三個回調方法供Android系統調用,用來計算在GLSurfaceView中繪制什麼以及如何繪制。
1.onSurfaceCreated():僅調用一次,可用來設置view的OpenGL ES環境。
2.onDrawFrame():每次View被重繪時被調用。
3.onSurfaceChanged():如果view的幾和形狀發生變化瞭就調用,例如當豎屏變為橫屏時。
        下面是一個OpenGL ES renderer的最基本的實現,僅在GLSurfaceView上畫瞭一個灰色的背景:
[java] 
public class MyGL20Renderer implements GLSurfaceView.Renderer { 
 
    public void onSurfaceCreated(GL10 unused, EGLConfig config) { 
        //設置背景色  
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
    } 
 
    public void onDrawFrame(GL10 unused) { 
        // 重繪背景色  
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    } 
 
    public void onSurfaceChanged(GL10 unused, int width, int height) { 
        GLES20.glViewport(0, 0, width, height); 
    } 

public class MyGL20Renderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        //設置背景色
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // 重繪背景色
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}        以上就是所有要做的東西!上面的代碼示例創建瞭一個簡單的Android應用,它使用OpenGL顯示瞭一個灰色的屏幕。雖然這段代碼並沒有做什麼有趣的事情,但是通過創建這些類,已經為你使用OpenGL繪制圖形奠定瞭基礎。
        註:當你使用OpengGLES 2.0 API時,可以不用去明白這些方法們為什麼都有一個GL10參數。其實這樣做的目的是讓Android框架能夠簡單的兼容OpenGL ES的各版本。
        如果你對OpenGL ES API很熟悉,你現在應該能夠在應用程序中建立一個OpenGL ES環境並開始繪制圖形瞭。然而,如果你想要學習更多的相關知識,那麼就請繼續關註下一節吧。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *