OpenGL ES 環境の構築

Android アプリで OpenGL ES を使用してグラフィックを描画するには、 ビューコンテナが表示されます。これを行うためのより簡単な方法の一つは、 GLSurfaceViewGLSurfaceView.RendererGLSurfaceView: 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 アプリには、 構築できます他のアプリとの主な違いは、アプリのレイアウトに何を配置するかです。 できます。多くのアプリでは TextViewButtonListView が使用されますが、OpenGL ES を使用するアプリでは次のことができます。 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 の実装に追加するもう 1 つのオプションとして、 を使用して描画データが変更された場合にのみビューを描画するように 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 に描画される要素。他にも レンダラの 3 つのメソッドが、Android システムによって呼び出されます。 GLSurfaceView に描画する方法:

  • onSurfaceCreated()~ ビューの OpenGL ES 環境をセットアップするために 1 回呼び出されます。
  • 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 パラメータがあるのか不思議に思われるかもしれません。 これらのメソッド シグネチャは、Android フレームワークのコードを保持するために 2.0 API で再利用されるだけです。 簡単になります。

OpenGL ES API に精通していれば、OpenGL ES をセットアップできます。 グラフィックの描画を開始します。ただし、この方法を詳しく知りたい場合は、 次のレッスンに進みましょう。いくつかのヒントを確認できます。