Android OpenGL ES 2.0-學習筆記(一)

一.初始化OpenGL

1.創建GLSurfaceView實例

private GLSurfaceView glSurfaceView;   

2.檢查系統是否支持OpenGL ES 2.0:通過ActivityManager來獲取設備的配置信息,再通過reqGlEsVersion變量來檢查設備OpenGL ES的版本號,如果reqGlEsVersion比0x20000大即表明設備支持OpenGL ES 2.0。

        final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);       
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        final boolean supportEs2 = configurationInfo.reqGlEsVersion >= 0x20000;        
        if(supportEs2 == true){
            Toast.makeText(FirstOpenGLProjectActivity.this,"此設備支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(FirstOpenGLProjectActivity.this,"此設備不支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
            return;
        }

谷歌官方的Android版本及OpenGL ES API的對應關係如下:

這裏寫圖片描述

3.爲OpenGL ES 2.0配置渲染表面

glSurfaceView.setEGLContextClientVersion(2);
glSurfaceView.setRenderer(new FirstOpenGLProjectRenderer());

4.處理Android Activity生命週期的事件,通過重寫這兩個方法,surface視圖才能正確暫停並繼續後臺渲染進程,同時釋放和繼續使用OpenGL上下文。

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

        if(rendererSet == true){
            glSurfaceView.onPause();
        }
    }

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

        if(rendererSet){
            glSurfaceView.onResume();
        }
    }

二.創建Renderer類

1.新建渲染器,需要實現Renderer的接口.

●onSurfaceCreated():在Surface被創建的時候調用.

●onSurfaceChanged():在Surface尺寸變化時調用,主要是橫豎屏切換的時候.

●onDrawFrame():繪製一幀圖像的時候被調用.

public class FirstOpenGLProjectRenderer implements Renderer {

    @Override
    public void onSurfaceCreated(GL10 glUnused, javax.microedition.khronos.egl.EGLConfig config){
        glUnused.glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
    }

    @Override
    public void onSurfaceChanged(GL10 glUnsed,int width,int height){
        glUnsed.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 glUnsed){
        glUnsed.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
}

三.完整代碼示例:

FirstOpenGLProjectActivity.java:

package com.example.firstopenglproject;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.opengl.GLSurfaceView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class FirstOpenGLProjectActivity extends AppCompatActivity {

    private GLSurfaceView glSurfaceView;
    private boolean rendererSet = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        glSurfaceView = new GLSurfaceView(this);

        final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        final boolean supportEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
        if(supportEs2 == true){
            Toast.makeText(FirstOpenGLProjectActivity.this,"此設備支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
            glSurfaceView.setEGLContextClientVersion(2);
            glSurfaceView.setRenderer(new FirstOpenGLProjectRenderer());
        }else{
            Toast.makeText(FirstOpenGLProjectActivity.this,"此設備不支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
            return;
        }
        setContentView(glSurfaceView);
    }

    /**
     * onPause()與onResume()這兩個方法非常重要,有了這兩個方法,surface視圖才能正確暫停並繼續後臺渲染線程
     * 同時釋放和繼續使用OpenGL上下文
     */

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

        if(rendererSet == true){
            glSurfaceView.onPause();
        }
    }

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

        if(rendererSet){
            glSurfaceView.onResume();
        }
    }
}

FirstOpenGLProjectRenderer.java:

package com.example.firstopenglproject;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class FirstOpenGLProjectRenderer implements Renderer {

    @Override
    public void onSurfaceCreated(GL10 glUnused, javax.microedition.khronos.egl.EGLConfig config){
        glUnused.glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
    }

    @Override
    public void onSurfaceChanged(GL10 glUnsed,int width,int height){
        glUnsed.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 glUnsed){
        glUnsed.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
}

真機運行效果:

這裏寫圖片描述

說明:以上內容參考自《OpenGL ES應用開發實踐指南 Android卷》

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