Android アプリで OpenGL ES を使用してグラフィックを描画するには、
ビューコンテナが表示されます。これを行うためのより簡単な方法の一つは、
GLSurfaceView
と GLSurfaceView.Renderer
。
GLSurfaceView
: OpenGL で描画されるグラフィックのビューコンテナです。
GLSurfaceView.Renderer
は、そのビュー内に描画されるものを制御します。詳細情報
詳しくは、OpenGL ES をご覧ください。
ご覧ください。
GLSurfaceView
は、OpenGL ES グラフィックスをアプリケーションに組み込む方法の一つにすぎません。
説明します。全画面または全画面に近いグラフィック ビューの場合、これは妥当な選択です。
OpenGL ES グラフィックをレイアウトのごく一部に組み込む場合は、
TextureView
をご覧ください。本格的な DIY デベロッパーの場合
SurfaceView
を使用して OpenGL ES ビューを構築できますが、
多くの追加コードを記述することになります。
このレッスンでは、GLSurfaceView
と GLSurfaceView.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 アプリには、
構築できます他のアプリとの主な違いは、アプリのレイアウトに何を配置するかです。
できます。多くのアプリでは TextView
、Button
、ListView
が使用されますが、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 をセットアップできます。 グラフィックの描画を開始します。ただし、この方法を詳しく知りたい場合は、 次のレッスンに進みましょう。いくつかのヒントを確認できます。