建立 OpenGL ES 環境

如要在 Android 應用程式中使用 OpenGL ES 繪製圖形,您必須建立 檢視容器其中一種較為直接的方式 GLSurfaceViewGLSurfaceView.Renderer。A 罩杯 GLSurfaceView 是使用 OpenGL 以及 GLSurfaceView.Renderer 可控制在此檢視畫面中繪製的內容。如要進一步瞭解 如要進一步瞭解這些類別,請參閱 OpenGL ES 開發人員指南

GLSurfaceView 只是將 OpenGL ES 圖形整合至您 應用程式。至於全螢幕或近乎全螢幕的圖像檢視,這是合理的選擇。 如果開發人員想要將 OpenGL ES 圖形納入一小部分的版面配置中, 請看一下 TextureView。對真正的 DIY 開發人員而言 可以使用 SurfaceView 建立 OpenGL ES 檢視畫面,但這需要 撰寫許多額外的程式碼

本課程將說明如何以簡單明瞭的方式,完成 GLSurfaceViewGLSurfaceView.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 應用程式,其活動與具備其他 存取 API其他應用程式的主要差異在於 活動。在許多應用程式中,您可能會在使用 OpenGL ES 的應用程式內使用 TextViewButtonListView,但您可以 並新增 GLSurfaceView

以下程式碼範例顯示使用 以 GLSurfaceView 做為主要檢視畫面:

Kotlin

class OpenGLES20Activity : Activity() {

    private lateinit var gLView: GLSurfaceView

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

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

Java

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView gLView;

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

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

注意:OpenGL ES 2.0 需要 Android 2.2 (API 級別 8) 以上版本。 因此請確認您的 Android 專案指定該 API 或更高版本。

建構 GLSurfaceView 物件

GLSurfaceView 是特殊檢視區塊,可讓您繪製 OpenGL ES 圖像。 它本身不會造成太大影響。物件的實際繪圖是由 您針對這個資料檢視設定的 GLSurfaceView.Renderer。事實上 您可能會想略過擴充方式 直接建立未經修改的 GLSurfaceView 執行個體,但進行這項操作。您需要在 擷取觸控事件,詳情請參閱「回應觸控式回應」一節 活動

GLSurfaceView 的基本程式碼非常精簡, 通常會使用 只要在使用該類別的活動中建立內部類別:

Kotlin

import android.content.Context
import android.opengl.GLSurfaceView

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    private val renderer: MyGLRenderer

    init {

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

        renderer = MyGLRenderer()

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

Java

import android.content.Context;
import android.opengl.GLSurfaceView;

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer renderer;

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

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

        renderer = new MyGLRenderer();

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

GLSurfaceView 實作項目還有另一個選用項目 只有在繪圖資料發生變更時,才會繪製檢視畫面 GLSurfaceView.RENDERMODE_WHEN_DIRTY 設定:

Kotlin

// Render the view only when there is a change in the drawing data
renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

Java

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

這項設定可防止系統重新繪製 GLSurfaceView 影格,直到你啟動為止 呼叫 requestRender(), 以提升這個範例應用程式的效率

建構轉譯器類別

實作 GLSurfaceView.Renderer 類別,或轉譯器 應用程式會在使用 OpenGL ES 時產生興趣。本課程 控制項 在 GLSurfaceView 上所繪製的內容。另有 Android 系統呼叫的轉譯器中的三個方法,以便找出 如何在 GLSurfaceView 上繪圖:

  • onSurfaceCreated(): 呼叫一次以設定檢視畫面的 OpenGL ES 環境。
  • onDrawFrame() - 每個 系統就會重新繪製檢視畫面
  • onSurfaceChanged() - 打過電話 檢視畫面的幾何圖形變更,例如當裝置的螢幕方向改變時。

以下是非常基本的 OpenGL ES 轉譯器實作項目,它只會繪製一個 GLSurfaceView 中的黑色背景:

Kotlin

import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

import android.opengl.GLES20
import android.opengl.GLSurfaceView

class MyGLRenderer : GLSurfaceView.Renderer {

    override fun onSurfaceCreated(unused: GL10, config: EGLConfig) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
    }

    override fun onDrawFrame(unused: GL10) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    }

    override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }
}

Java

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.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。

注意:當您使用 OpengGL ES 2.0 API 時,您可能會好奇這些方法為何含有 GL10 參數。 這些方法簽章會重複用於 2.0 API,以便保留 Android 架構程式碼 。

如果您熟悉 OpenGL ES API,您現在應該可以設定 OpenGL ES 即可開始繪製圖形。但如果您需要更多說明 開始使用 OpenGL,您可以在下一堂課程中學到更多提示。