OpenGL es 初識

在Android下的第一個OpenGL es 2.0的項目,我們從最簡單開始。使用OpenGL es改變屏幕的顏色。

雖然簡單,但是我看的了好多資料基本都沒有講這些基礎,上來就畫個三角形,搞得看完了。我發現什麼都沒有記住,到時在複製粘貼。

既然是要做最好,肯定要和別人不一樣,基礎其實很重要的。

一、創建OpenGL es項目

接下你將學習OpenGL es 2.0對Android入門,是一些比較簡單的內容,你可以很全面的瞭解OpenGL es在Android下使用。

1.檢查手機是否支持OpenGL es 2.0

  • OpenGL ES 1.0和1.1 - Android 1.0及更高版本支持此API規範。
  • OpenGL ES 2.0 - Android 2.2(API級別8)及更高版本支持此API規範。
  • OpenGL ES 3.0 - Android 4.3(API級別18)及更高版本支持此API規範。
  • OpenGL ES 3.1 - Android 5.0(API級別21)及更高版本支持此API規範。

我們學習的是OpenGL 2.0 ,可以看出OpenGL es 2.0 對Android 手機的要求,並不高。現在4.4的系統谷歌都推薦放棄了。

但是,我們寫的App都是在別人手機上,我怎麼知道,他(她)的手機支持呢?

有兩種辦法解決,這個問題。

(1)在AndroidManifest 下聲明

你需要在清單列表(AndroidManifest.xml)聲明,你需要使用OpenGL es和版本。

<uses-feature android:glEsVersion = “0x00020000” android:required = “true” />

glEsVersion = “0x00020000” : 指告訴系統這個應用程序需要OpenGL ES 2.0,0x00020000就是openGL的版本。

如果你需要OpenGL es 3.0 你只需要把 0x00020000改爲0x00030000,依次類推。

提問:你有沒有想過在AndroidManifest聲明有什麼用?

原因:

在Android中AndroidManifest是不會被反編譯的,應用市場可以直接通過分析AndroidManifest來知道。

這個App需要什麼權限,需要什麼版本的系統支持。

這裏是用來過濾不支持opneGL es 2.0的手機的,應用市場會對不支持的隱藏。(Google Play就是這樣,別的不知道)

(2)在代碼檢查

在一些特點的開發中,我們需要它安裝到設備上去,也需要知道我這個設備是否支持OpenGL es 2.0,則需要代碼檢查。

 private boolean isOpenGL() {
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
            return false;
        }
        return true;

    }

具體怎麼使用看開發場景了,大部分我們只需要在AndroidManifest簡單聲明一下。

因爲基本99.8%的手機都支持了。點擊可以查看Google的統計

(3)我需要使用3.0又怕不支持,怎麼辦?

還有一種情況,在不支持OpenGL es 3.0的時候使用OpenGL 2.0 。

其實谷歌也告訴我們怎麼做了。

這裏我就不講直接指向Google的資料。如果訪問不到,請自己百度,我就不費力講這裏了。

二、OpenGL es 2.0的基礎知識

準備工作,做完了,我們還需要了解基礎知識。

1.簡單說明

舉個例啊,在現實你要畫畫需要一張紙和一個筆纔可以,在Android下也是這樣。

GLSurfaceView 就是這張紙。當然你也可以使用TextureViewSurfaceView,但是這都是以後的事了。

Renderer :就是筆。Renderer是渲染器負責進行OpenGL調用以渲染幀。

2.具體說明

(1)GLSurfaceView 

GLSurfaceView:SurfaceView的一種實現,它使用專用表面來顯示OpenGL渲染。

你需要使用它邦定Activity的生命週期,防止發生錯誤。

(2)Renderer  渲染器

GLSurfaceView.Renderer在使用OpenGL ES的應用程序中實現類或渲染器是事情開始變得有趣的地方。此類控制GLSurfaceView與其關聯的內容。

  • onSurfaceCreated() - 調用一次以設置視圖的OpenGL ES環境。
  • onSurfaceChanged() - 如果視圖的幾何圖形發生更改,則調用此方法。(例如,設備的屏幕方向更改)
  • onDrawFrame() - 爲每次重繪視圖調用。(我們大多操作在這個方法)

注意點:

onSurfaceCreated()    這個方法不只是第一次創建纔會被調用。當你返回主頁面在進入是同樣會調用,注意使用哦!

GLSurfaceView 會在一個單獨的線程裏調用Renderer渲染,如果需要通訊要轉到主線程。

三、簡單實戰

接下我們要進入實戰接待。當然很簡單,就當是簡單的瞭解吧!

我會把之前的步驟也演示出來,確保你得到的效果和我一致。

1. AndroidManifest.xml  

對,聲明需要OpenGL es 2.0 ,還是以2.0 爲準。

  <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

2.MainAcitvity

我直接加載的是GLSurfaceView,還有Shwo就是隻是簡單的工具類,在這只是個Toast。

下面會有我的項目的Demo,它在GitHub上。

   private MyGLSurfaceView mMyGLSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMyGLSurfaceView = new MyGLSurfaceView(this);
        if (isOpenGL()) {
            setContentView(mMyGLSurfaceView);
        } else {
           Show.showToast("沒有找到OpenGL 2.0");
            // 你也可以在這設置別的佈局
            setContentView(R.layout.activity_demo);
        }
    }

    private boolean isOpenGL() {
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
            Show.showToast("該設備不支持OpenGL es 2.0");
            return false;
        }
        return true;

    }

    @Override
    protected void onPause() {
        super.onPause();
        mMyGLSurfaceView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMyGLSurfaceView.onResume();
    }

3. MyGLSurfaceView

  private MyRenderer mMyRenderer;

    public MyGLSurfaceView(Context context) {
        super(context);
        // 創建OpenGL版本
        setEGLContextClientVersion(2);
        //  創建自己的渲染器
        mMyRenderer = new MyRenderer();
        // 設置渲染器以在GLSurfaceView上繪圖
        setRenderer(mMyRenderer);
        // 渲染器僅在創建曲面或requestRender()調用曲面時渲染。
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    }

setEGLContextClientVersion () 必須設置

setRenderMode()   通常設置兩種參數,分別是RENDERMODE_WHEN_DIRTYRENDERMODE_CONTINUOUSLY

RENDERMODE_WHEN_DIRTY:   連續調用渲染器以重新渲染場景。

RENDERMODE_CONTINUOUSLY:渲染器僅在創建曲面或requestRender()調用曲面時渲染。

這裏是爲節約內存。

3.MyRenderer

這個類纔是最關鍵的,基本操作在這裏進行。

 class MyRenderer implements GLSurfaceView.Renderer {
    
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Show.showLog("onSurfaceCreated");
        // 設置清屏顏色
        // 第一個參數紅色、黃色、藍色、透明度
        GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

    }

    //onSurfaceChanged。surface大小改變的回調。比如橫豎屏切換
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Show.showLog("onSurfaceChanged");
        // 設置在屏幕上的繪製窗口大小。
        GLES20.glViewport(0, 0, width, height);

    }

    //onDrawFrame。每一次繪製幀的時候調用的方法。
    @Override
    public void onDrawFrame(GL10 gl) {
        Show.showLog("onDrawFrame");
        //清屏,每次調用就會執行
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }
}

簡單的功能,註釋其實已經很清楚了,你現在不要急着想知道特別清楚。這裏只是讓你大概瞭解一下OpenGL es,效果就是在手機上顯示給藍色。這個例子很簡單,我希望你能自己寫出來,並在收手機上運行出來。

這章基本把一些特別基礎的講完了,希望你有所收穫。這章的Demo對應的Demo目錄的demo下面的代碼,功能很簡單,我就不貼gitHub的地址了,等下長在貼吧!

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