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

傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ http://blog.csdn.net/leverage_1229
html

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

        使用GLSurfaceView幾乎是整合OpenGL ES到你的應用中的惟一方式。對於一個須要全屏或近乎屏幕圖形視圖,它是一個合理的選擇。若是開發人員只是指望藉助OpenGL ES在某個佈局中一小部分繪圖,則應該考慮使用TextureView。若是以爲本身是「大牛」,徹底可使用SurfaceView創建一個OpenGL ES視圖,但這樣作須要編寫至關多的額外的代碼。
        這一節將介紹如何在一個簡單應用的activity中完成一個最小的GLSurfaceView和GLSurfaceView.Renderer的實現。

1在Manifest文件中聲明使用OpenGL ES

        爲了可以使用OpenGL ES 2.0 API,你必須在manifest文件中添加如下聲明:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
        若是你的應用須要使用紋理壓縮功能,還要聲明設備須要支持什麼樣的壓縮格式:
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
        更多關於紋理壓縮格式的信息,請參閱OpenGL開發人員指南。

2爲OpenGL ES圖形建立一個Activity

        這個Activity跟任何其餘的應用程序中的Activity同樣,也有一個用戶界面。惟一的區別是在它的佈局文件中存放的視圖不是TextView、Button和ListView,而是一個GLSurfaceView。
        下面的代碼演示了使用GLSurfaceView做爲主視圖的Acitivity的核心代碼:
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或更高。

3構造一個GLSurfaceView對象

        事實上GLSurfaceView並無提供不少功能,實際上繪製對象的任務都在GLSurfaceView.Renderer中進行。因此GLSurfaceView中代碼也很是少,甚至能夠直接使用GLSurfaceView。但最好別這樣作,由於你須要擴展這個類來響應觸摸事件。
        一般在當前Activity中之內部類的方式建立GLSurfaceView,這樣實現起來很是快,核心代碼以下:
class MyGLSurfaceView extends GLSurfaceView {

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

        // 設置渲染對象,用於控制在GLSurfaceView中的繪製工做
        setRenderer(new MyRenderer());
    }
}
        當使用OpenGL ES 2.0時,你必須在GLSurfaceView構造器中調用另一個方法,它指定了你將要使用2.0版的API:
// 建立一個OpenGL ES 2.0 context
setEGLContextClientVersion(2);
        注:若是你使用的是OpenGL ES 2.0的API,那麼請確保在Manifest文件中做出相關API版本聲明。有關更多信息,請參見在Manifest文件中聲明使用OpenGL ES。
        另外一個能夠添加到你的GLSurfaceView中可選操做是設置渲染模式爲僅當繪製數據發生改變時才繪製view。該渲染模式常量是GLSurfaceView.RENDERMODE_WHEN_DIRTY。
// 只有在繪製數據改變時才繪製view
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
        該設置能夠防止GLSurfaceView幀重繪,直到調用requestRender()方法。這樣的繪製機制更高效。

4構造一個Renderer類

        Renderer類負責控制在GLSurfaceView中繪製任務,並提供三個回調方法供Android系統調用,用來計算在GLSurfaceView中繪製什麼以及如何繪製。
4.1onSurfaceCreated():僅調用一次,用於設置view的OpenGL ES環境。
4.2onDrawFrame():每次重繪view時調用。
4.3onSurfaceChanged():當view的幾何形狀發生變化時調用,好比設備從豎屏變爲橫屏。
        下面是一個OpenGL ES renderer的最基本的實現,僅在GLSurfaceView上畫了一個灰色的背景:
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環境並開始繪製圖形了。然而,若是你想要學習更多的相關知識,那麼就請繼續關注下一節吧。
相關文章
相關標籤/搜索