Android OpenGL ES學習筆記之實現OpenGL ES接口

一、GLSurfaceView介紹

在Android平臺上實現OpenGL的view很簡單,只需要用到GLSurfaceView和GLSurfaceView.Renderer。

GLSurfaceView是用來連接OpenGL ES和android的view結構的.GLSurfaceView位於android.opengl包類,繼承自SurfaceView

public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    ......
    }

二、GLSurfaceView.Renderer介紹

Renderer也叫渲染器,是一個接口,位於GLSurfaceView類中.

public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    ......
    public interface Renderer {

        void onSurfaceCreated(GL10 gl, EGLConfig config);

        void onSurfaceChanged(GL10 gl, int width, int height);

        void onDrawFrame(GL10 gl);
    ......
    }   
    }

提供了三個方法

 - onSurfaceCreated  -------- 在Surface創建的時候調用
 - onSurfaceChanged--------   在Surface改變的的時候調用
 - onDrawFrame  ------------- 在Surface上繪製的時候調用

三、搭建一個最基本的框架

按照以下步驟

  1. 新建一個Android項目
  2. 新建GLSurfaceView實例
  3. 創建渲染器Renderer實例
  4. 給GLSurfaceView設置Renderer實例
  5. 顯示GLSurfaceView

一言不合貼代碼

public class MainActivity extends Activity {

    private GLSurfaceView glSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //如果本設備支持OpenGl ES 2.0
        if (IsSupported()) {

            //新建GLSurfaceView實例
            glSurfaceView = new GLSurfaceView(this);

            // 創建渲染器實例
            MyRenderer mRenderer = new MyRenderer();

            // 設置渲染器
            glSurfaceView.setRenderer(mRenderer);

            //顯示SurfaceView
            setContentView(glSurfaceView);
        }
    }

IsSupported()方法的代碼如下

private boolean IsSupported() {
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000;

        return supportsEs2;
    }

實際中我們以後所有的處理都實現在MyRenderer這個接口的實現類,我在這裏顯示一個綠色的空白屏幕

public class MyRenderer implements GLSurfaceView.Renderer {

        // Surface創建的時候調用
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // 設置清屏顏色
            gl.glClearColor(0f, 1f, 0f, 0f);

        }

        // Surface改變的的時候調用
        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // 設置窗口大小
            gl.glViewport(width / 4, width / 2, width / 2, height / 2);
        }

        // 在Surface上繪製的時候調用
        @Override
        public void onDrawFrame(GL10 gl) {
            //設置渲染模式                        
            glSurfaceView. setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

            // 清除屏幕 
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);            
        }
    }

最後爲了配合Activity的生命週期,我們加上如下代碼

@Override
    protected void onPause() {
        super.onPause();
        if (glSurfaceView != null) {
            glSurfaceView.onPause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (glSurfaceView != null) {
            glSurfaceView.onResume();
        }
    }

我詳細的介紹以下三個方法.

onSurfaceCreated

它是在Surface創建的時候調用,可以在這裏進行一些初始化操作,它攜帶兩個參數GL10 和 EGLConfig。

 - GL10         繼承自GL的一個接口,封裝了程序語言爲OpenGL綁定的核心功能,我們可以把它理解爲一個“畫筆”,操作它提供的的方法來在GLSurfaceView上這塊“畫布”繪製
 - EGLConfig    是一個抽象類,但是沒有任何實現,不管它

我在這裏調用gl.glClearColor(0f, 1f, 0f, 0f)設置清屏顏色爲綠色,所謂清屏顏色就是當開始繪製時,屏幕所顯示的顏色。glClearColor(float red, float green, float blue, float alpha)四個參數對應紅、綠、藍、透明度。這裏的取值範圍是0到1f。不是RGB中0~255。

onSurfaceChanged

它是在Surface大小改變的時候調用,這個方法只會執行一次,Surface創建時初始大小爲0,所以需要指定窗口大小,調用glViewport(int x, int y, int width, int height)方法傳入四個參數,x,y座標和寬高。

這裏要注意一點,這個窗口座標原點是位於屏幕左下角,與android中的屏幕座標系不一樣

Android中的屏幕座標系如圖所示

這裏寫圖片描述

OpenGl中的窗口座標系

這裏寫圖片描述

onDrawFrame

它是在Surface上繪製的時候調用。

1.通過setRenderMode設置渲染模式,有兩種供選擇

 - GLSurfaceView.RENDERMODE_CONTINUOUSLY 不間斷的繪製,默認渲染模式是這種

 - GLSurfaceView.RENDERMODE_WHEN_DIRTY   在屏幕變髒時繪製,也就是當調用GLSurfaceView的requestRender ()方法後纔會執行一次(第一次運行的時候會自動繪製一次)

2.調用glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除屏幕顏色,執行這個方法之後,屏幕就會渲染之前通過glClearColor設置的清屏顏色.如下圖所示

這裏寫圖片描述

如果設置渲染模式爲GLSurfaceView.RENDERMODE_CONTINUOUSLY那麼onDrawFrame方法會一直執行,看打印

這裏寫圖片描述

如果想看得更直觀一點,那麼打開手機開發者選項,打開顯示Surface更新,你會看到屏幕一直在閃,眼睛都要亮瞎了。

四、總結

最基本的框架已經搭建完了,以後就在這個基礎上進一步學習了。

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