圖片和圖形之構建一個OpenGL ES環境(10)

原文

概要


構建一個OpenGL ES環境
爲了在Android應用程序中使用OpenGL ES繪製圖形,您必須爲它們創建一個視圖容器。其中一種更直接的方法是實現a GLSurfaceView和a GLSurfaceView.Renderer。A GLSurfaceView是使用OpenGL繪製的圖形的視圖容器,並 GLSurfaceView.Renderer控制該視圖內繪製的內容。有關這些類的更多信息,請參閱OpenGL ES 開發人員指南。

GLSurfaceView只是將OpenGL ES圖形集成到您的應用程序中的一種方法。對於全屏或近滿屏圖形視圖,這是一個合理的選擇。希望將OpenGL ES圖形集成到其小部分佈局中的開發人員應該關注一下TextureView。對於真正的自己動手的開發人員,也可以使用OpenGL ES視圖來構建SurfaceView,但這需要編寫相當多的附加代碼。

本課程介紹瞭如何完成一個最小的實現GLSurfaceView,並GLSurfaceView.Renderer在一個簡單的應用程序活動。

聲明OpenGL ES在清單中的使用


爲了讓您的應用程序使用OpenGL ES 2.0 API,您必須將以下聲明添加到清單中:

<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開發人員指南。

爲OpenGL ES圖形創建一個活動


使用OpenGL ES的Android應用程序具有與具有用戶界面的任何其他應用程序一樣的活動。與其他應用程序的主要區別在於您爲活動佈置的內容。雖然在許多應用程序中您可能會使用TextView,Button而ListView在使用OpenGL ES的應用程序中,您也可以添加一個GLSurfaceView。

以下代碼示例顯示了使用GLSurfaceView作爲主視圖的活動的最小實現 :

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView mGLView;

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

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}

注意: OpenGL ES 2.0需要Android 2.2(API Level 8)或更高版本,因此請確保您的Android項目針對的是API或更高版本。

構建一個GLSurfaceView對象


A GLSurfaceView是您可以繪製OpenGL ES圖形的專用視圖。它本身並沒有多大作用。對象的實際繪製由GLSurfaceView.Renderer您在此視圖中設置的控制 。實際上,這個對象的代碼太稀薄了,你可能會試圖跳過擴展它,只是創建一個未修改的 GLSurfaceView實例,但不這樣做。您需要擴展此類以捕獲觸摸事件,這在“ 觸摸事件的響應”課程中有介紹。

a的基本代碼GLSurfaceView是最小的,所以爲了快速實現,通常在使用它的活動中創建一個內部類:

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer mRenderer;

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

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);

        mRenderer = new MyGLRenderer();

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(mRenderer);
    }
}

另一個可選的GLSurfaceView實現方式是將渲染模式設置爲僅在使用以下GLSurfaceView.RENDERMODE_WHEN_DIRTY 設置更改繪圖數據時繪製視圖 :

// 呈現視圖時,纔會有在繪圖數據的變化
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

構建一個渲染器類


GLSurfaceView.Renderer在使用OpenGL ES的應用程序中實現類或渲染器是開始變得有趣的地方。這個類控制GLSurfaceView與它關聯的內容。在渲染器中有三種方法由Android系統調用,以便找出在a GLSurfaceView:上繪製什麼和如何繪製:

  • onSurfaceCreated() - 調用一次以設置視圖的OpenGL ES環境。
  • onDrawFrame() - 爲視圖的每次重繪調用。
  • onSurfaceChanged() - 如果視圖的幾何結構發生變化(例如,當設備的屏幕方向改變時),則調用此方法。

這是OpenGL ES渲染器的一個非常基本的實現,它只不過是在以下內容中繪製黑色背景GLSurfaceView:

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        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繪製圖形元素所需的基礎。

注意:您可能想知道爲什麼這些方法有一個GL10參數,當您使用OpengGL ES 2.0 API時。這些方法簽名僅用於2.0 API以保持Android框架代碼更簡單。

如果您熟悉OpenGL ES API,則現在應該能夠在您的應用程序中設置OpenGL ES環境並開始繪製圖形。但是,如果您需要更多的OpenGL入門幫助,請繼續閱讀下一課以獲取更多提示。

    Lastest Update:2018.04.25

聯繫我

QQ:94297366
微信打賞:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公衆號推薦:

圖片和圖形之構建一個OpenGL ES環境(10)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章