1. 程式人生 > >Android OpenGL ES2.0基礎(一、最簡單的使用)

Android OpenGL ES2.0基礎(一、最簡單的使用)

一、OpenGL ES是什麼

OpenGL(Open Graphics Library)是一個跨程式語言、跨平臺的3D圖形庫。廣泛應用於遊戲、娛樂、VR等領域.安卓系統中的核心庫層就有這個。OpenGL ES是在OpenGL基礎上針對移動端而裁剪的 。OpenGL ES由當初的1.0、2.0發展到現在的3.0了。我這個系列是針對2.0的.因為3.0的只支援android 4.3以上的版本,即時是4.3以上,有的手機硬體也還不支援3.0 。

二、開發要點

對於OpenGL最簡單的開發只需用兩個類即可,GLSurfaceView和GLSurfaceView.Renderer。
  1. GLSurfaceView可以直接new,也可以放到佈局裡。
  2. 一個GLSurfaceView要配套一個Renderer,這個Renderer是一個介面,裡面有三個函式。這點跟Surfaceiew很像。尤其是其中的onDrawFrame()可以類比為Android裡View的onDraw()函式。
interface GLSurfaceView.Renderer {
//在Surface建立的時候呼叫,可以在這裡進行一些初始化操作
public void onSurfaceCreated(GL10 gl, EGLConfig config);
//在Surface改變的的時候呼叫
public void onSurfaceChanged(GL10 gl, int
width, int height); //在Surface上繪製的時候呼叫 public void onDrawFrame(GL10 gl); }
  1. 記得在Manifests檔案中新增
<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"
/>

三、著(kai)手(shi)開(ru)發(keng)

  1. 新建一個Android專案
  2. 新建GLSurfaceView例項
  3. 建立渲染器Renderer例項
  4. 給GLSurfaceView設定Renderer例項
  5. 顯示GLSurfaceView

MyGLSurfaceView繼承自GLSurfaceView

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
/**
 * Created by Administrator on 2017/3/8.
 * description :
 */
public class MySurfaceView extends GLSurfaceView {

    MyRenderer mRenderer;

    public MySurfaceView(Context context) {
        super(context);
        init();
    }
    private void init(){
        // 建立一個OpenGL ES 2.0 context
        setEGLContextClientVersion(2);
        //建立渲染器例項
        mRenderer = new MyRenderer();
        // 設定渲染器
        setRenderer(mRenderer);
        //設定渲染模式
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }
}

Render的渲染模式有兩種

  1. GLSurfaceView.RENDERMODE_CONTINUOUSLY
    不間斷的繪製,預設渲染模式是這種
  2. GLSurfaceView.RENDERMODE_WHEN_DIRTY
    不會主動繪製,也就是當呼叫GLSurfaceView的requestRender()方法後才會執行一次(第一次執行的時候會自動繪製一次)

MyRender繼承自GLSurfaceView.Renderer,一些初始化和一些邏輯都在這裡進行

public class MyRenderer implements GLSurfaceView.Renderer {

        // Surface建立的時候呼叫
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // 設定清屏顏色
            GLES20.glClearColor(0f, 1f, 0f, 0f);
        }
        // Surface改變的的時候呼叫
        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // 設定視窗大小
            GLES20.glViewport(0, 0, width, height);
        }
        // 在Surface上繪製的時候呼叫
        @Override
        public void onDrawFrame(GL10 gl) {
            //呼叫glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除螢幕顏色,執行這個方法之後
            //螢幕就會渲染之前通過glClearColor設定的清屏顏色.
            GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT);
        }
 }

在MainActivity中使用

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

/**
 * Created by Administrator on 2017/3/8.
 * description :
 */
public class MainActivity extends AppCompatActivity {

    MySurfaceView mySurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mySurfaceView = new MySurfaceView(this);
        setContentView(mySurfaceView);
    }
    @Override
    protected void onPause() {
        super.onPause();
        mySurfaceView.onPause();
    }
    @Override
    protected void onResume() {
        super.onResume();
        mySurfaceView.onResume();
    }
}

執行效果

這裡寫圖片描述