ゼロ:環境構築の目的
AndroidアプリケーションでOpenGLESを使用してグラフィックを描画するには、それらのビューコンテナを作成する必要があります。最も直接的または一般的な方法は、GLSurfaceViewとGLSurfaceView.Rendererを実装することです。GLSurfaceViewは、OpenGLでグラフィックを描画するためのビューコンテナであり、GLSurfaceView.Rendererは、ビューに描画されるコンテンツを制御します。
以下では、GLSurfaceViewとGLSurfaceView.Rendererを使用して、単純なアプリケーションのアクティビティに最小限の実装を行う方法について説明します。
1つ:マニフェストでOpenGLESの使用を宣言します
アプリケーションでOpenGLES 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" />
テクスチャ圧縮形式の詳細については、https://developer.android.com/guide/topics/graphics/opengl.html#texturesにアクセスしてさらに理解してください。
2:OpenGLESグラフィックを表示するアクティビティを作成します
OpenGL ESを使用するアプリケーションのアクティビティは、他のアプリケーションのアクティビティと同じです。違いは、設定するアクティビティのレイアウトにあります。OpenGL ESを使用する多くのアプリでは、テキストビュー、ボタン、リストビュー、およびGLSurfaceViewを追加できます。
次のコードは、GLSurfaceViewをメインビューとして使用する基本的な実装を示しています。
public class OpenGLES20Activity extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
注:OpenGL ES 2.0に必要なAndroidバージョンは2.2以降です。Androidプロジェクトの対象となるバージョンに互換性があることを確認してください。
3、GLSurfaceViewオブジェクトを作成します
GLSurfaceViewは、OpenGL画像を描画できる特別なビューです。ただし、ビュー自体はあまり機能しません。メインの描画は、ビューに設定されたGLSurfaceView.Rendererによって制御されます。実際、このオブジェクトを作成するためのコードはほとんどありません。extends操作をスキップして、変更されていないGLSurfaceViewインスタンスを作成することもできますが、これはお勧めしません。場合によっては、タッチイベントをキャプチャするためにこのクラスを拡張する必要があるためです。タッチイベントをキャプチャする方法については、後の記事で紹介します。
GLSurfaceViewの基本コードは非常に小さいので、すばやく実装するために、通常、それを使用して実装するアクティビティに内部クラスが作成されます。
class MyGLSurfaceView extends GLSurfaceView {
private final MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context){
super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
mRenderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(mRenderer);
}
}
GLSurfaceView.RENDERMODE_WHEN_DIRTYを設定して、データが変更されたときにGLSurfaceViewを更新する、つまりGLSurfaceViewのレンダリングモードを変更することができます。この設定は、requestRender()を呼び出すまでGLSurfaceViewが再描画されないようにすることができます。この設定は、サイレント書き込みレベルでのAPPにとってより有益です。
第四に、レンダラークラスを作成します
GLSurfaceView.Rendererクラスの実現は、アプリケーションでOpenGLESを使用できるようにするための真のスタートです。このクラスは、それに関連付けられたGLSurfaceViewによって描画されるコンテンツを制御します。レンダラーには、GLSurfaceViewで何を描画するか、どのように描画するかを知るためにAndroidシステムから呼び出すことができる3つのメソッドがあります。
- onSurfaceCreated()-ビューのOpenGL環境が作成されたときに呼び出されます。
- onDrawFrame()-ビューが再描画されるたびに呼び出されます
- onSurfaceChanged()-このメソッドは、ビューのジオメトリが変更された場合(たとえば、デバイスの画面の向きが変更された場合)に呼び出されます。
以下は、OpenGL ESレンダラーを使用した基本的な実装です。実行する唯一のことは、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);
}
}
五数要約
上記のコンテンツは、OpenGL ESの基本的な環境構成です。この記事のコードは、単純なAndroidアプリケーションを作成し、OpenGLを使用して黒板を表示することだけです。他の興味深いことはしていませんが、これらのクラスを作成することで、OpenGLを使用してグラフィック要素を描画するための基礎がすでにできているはずです。
注:OpenGL ES 2.0APIを使用するときにGL10パラメーターが表示される理由に興味があるかもしれません。これらのメソッドシグネチャは2.0APIで単純に使用されるため、Androidフレームワークコードを単純に保つことができます。
OpenGL APIに精通している場合は、APPでOpenGL ES環境を作成し、描画を開始できるはずです。ただし、OpenGLを使用するためにさらにヘルプが必要な場合は、次の記事を楽しみにしてください。