AndroidアプリケーションでOpenGL ESを使ってグラフィックを描画するには、コンテナとしてビューを作成する必要があります。
これらのクラスの詳細については、『OpenGL ES Developer's Guide』を参照してください。
GLSurfaceViewを使用することは、OpenGL ESをアプリケーションに統合するほぼ唯一の方法です。フルスクリーンまたはそれに近いグラフィックビューを必要とするアプリケーションでは、これは論理的な選択です。もし、開発者がOpenGL ESでレイアウトのごく一部を描画することを期待しているだけなら、TextureViewの使用を検討すべきです。もし、彼らが「大物」だと感じるなら、SurfaceViewを使ってOpenGL ESビューを構築することができますが、そうするには、かなりの量の追加コードが必要になります。しかし、そうすると、かなりの追加コードが必要になります。
このセクションでは、簡単なアプリケーションのアクティビティで、最小限のGLSurfaceViewとGLSurfaceView.Rendererの実装を完了する方法を説明します。
I. マニフェスト・ファイルでOpenGL ESの使用を宣言します。
OpenGL ES 2.0 API を使用できるようにするには、マニフェスト・ファイルに次の宣言を追加する必要があります:
[html] view plaincopyprint?
アプリケーションがテクスチャ圧縮を使用する必要がある場合は、デバイスがサポートする必要がある圧縮形式も宣言してください:
[html] view plaincopyprint?
テクスチャ圧縮フォーマットの詳細については、『OpenGL Developer's Guide』を参照してください。
II. OpenGL ESグラフィックス用のアクティビティの作成
このアクティビティは、アプリケーション内の他のアクティビティと同じようにユーザーインターフェイスを持っています。唯一の違いは、TextView、Button、ListViewの代わりに、レイアウトファイルに保存されているビューがGLSurfaceViewであることです。
次のコードは、メインビューとして GLSurfaceView を使用した Acitivity のコアコードを示しています:
[java] view plaincopyprint?
public class OpenGLES20 extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// GLSurfaceViewオブジェクトを作成し、現在のアクティビティのContentViewに設定する。
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
public class OpenGLES20 extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// GLSurfaceViewオブジェクトを作成し、現在のアクティビティのContentViewに設定する。
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
注意:OpenGL ES 2.0はAndroid 2.2以上を必要としますので、AndroidプロジェクトのランタイムターゲットのAPIレベルが8以上であることを確認してください。
GLSurfaceViewオブジェクトの構築
実際、GLSurfaceViewは多くの機能を提供しておらず、オブジェクトを描画するタスクはGLSurfaceView.Rendererで行われています。そのため、GLSurfaceViewのコードも非常に少なく、GLSurfaceViewを直接使用することも可能ですが、***タッチイベントに応答するためにこのクラスを拡張する必要があるため、***しないでください。
GLSurfaceViewは通常、現在のアクティビティの内部クラスとして作成されます。
[java] view plaincopyprint?
class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context){
スーパー;
// 设置渲染对象,用于控制在GLSurfaceView中的绘制工作
setRenderer(new MyRenderer());
}
}
class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context){
スーパー;
// 设置渲染对象,用于控制在GLSurfaceView中的绘制工作
setRenderer(new MyRenderer());
}
}
OpenGL ES 2.0を使用する場合は、APIのバージョン2.0を使用することを指定する別のメソッドをGLSurfaceViewコンストラクタで呼び出す必要があります:
[java] view plaincopyprint?
// 创建一个OpenGL ES 2.0 context
setEGLContextClientVersion(2);
// 创建一个OpenGL ES 2.0 context
setEGLContextClientVersion(2);
注:如果你使用的是OpenGL ES 2.0的API,那么请确保在Manifest文件中作出相关API版本声明 有关更多信息,请参见在Manifest文件中声明使用OpenGL ES。
GLSurfaceViewに追加できるもう一つのオプションは、描画データが変更された時だけビューを描画するようにレンダリングモードを設定することである。レンダリングモード定数はGLSurfaceView.RENDERMODE_WHEN_DIRTY。
[java] view plaincopyprint?
// 描画データが変更されたときだけビューを描画する。
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
// 描画データが変更されたときだけビューを描画する。
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
この設定により、requestRender()メソッドが呼び出されるまで、GLSurfaceViewのフレームが再描画されないようになります。これにより、描画メカニズムがより効率的になります。
IV.レンダラー・クラスの構築
RendererクラスはGLSurfaceViewの描画タスクを制御する役割を担っており、AndroidがGLSurfaceViewに何をどのように描画するかを計算するために呼び出す3つのコールバックメソッドを提供しています。
1. onSurfaceCreated():一度だけ呼び出され、ビューのOpenGL ES環境を設定するために使用されます。
2. onDrawFrame(): ビューが再描画されるたびに呼び出されます。
3. onSurfaceChanged():デバイスが垂直から水平になるなど、ビューのジオメトリが変更されたときに呼び出されます。
以下は、OpenGL ESレンダラーの最も基本的な実装で、GLSurfaceViewにグレーの背景だけが描画されます:
やることは以上です!上のコード例では、OpenGLを使って灰色の画面を表示するシンプルなAndroidアプリを作成しています。このコードでは面白いことは何もできませんが、これらのクラスを作成することで、OpenGLを使ってグラフィックを描画するための基礎ができました。
注意: OpengGLES 2.0 APIを使用する場合、これらのメソッドにGL10パラメータがある理由を理解する必要はありません。実際、この目的は、AndroidフレームワークがOpenGL ESのすべてのバージョンと互換性を持つことを簡単にするためです。