Android公式開発ドキュメントTrainingシリーズ中国語版:OpenGL図面の環境構成


原文住所:http://android.xsoftlab.net/training/graphics/opengl/index.html
ことばを引く
Android frameworkレイヤは、きらびやかな機能UIを作成するために多くの標準ツールを提供しています.しかし、画面の描画をより多く制御したり、3 Dグラフィックで描画したりするには、他のツールが必要です.Android frameworkが提供するOpenGL ES APIは、ハイエンドの大気、天馬行空の図形を表示するためのツールを提供しています.あなたが望む限り、それはできます.また、多くのデバイスが提供するGPU加速機能のおかげでもあります.
このレッスンでは、環境の設定、オブジェクトのペイント、ペイント要素の移動、タッチイベントへの応答など、OpenGLの開発基盤について説明します.
次のサンプルコードにはOpenGL ES 2.0 APIが使用され、このバージョンは現在のAndroidデバイスで推奨されています.OpenGL ESの詳細については、OpenGL開発ガイドを参照してください.
Note:OpenGL ES 1.x APIとOpenGL ES 2.0 APIを混同しないように注意!この2つのバージョンのAPIの間では交換して使用することはできませんが、もし使用するならば、1つの結果だけが悲劇です.
OpenGL ES関連環境の構築
AndroidアプリケーションでOpenGL ESを使用できるようにするには、OpenGL ESが描画するグラフィック領域にViewコンテナを作成する必要があります.1つの実装方法は、GLSurfaceViewおよびGLSurfaceView.Rendererを実装することである.ここでGLSurfaceViewはOpenGLにグラフィックを描画するViewコンテナである.GLSurfaceView.Rendererは、先ほどのViewで何を描くべきかを制御します.これらのクラスの詳細については、OpenGL ES開発ガイドを参照してください.
GLSurfaceViewはOpenGL ESをアプリケーションに統合する唯一の方法である.GLSurfaceViewは、フルスクリーンまたはフルスクリーンに近いグラフィックViewに最適です.開発者がOpenGL ESを小さな領域に統合する必要がある場合は、TextureViewを使用する必要があります.この他にもSurface Viewを使用できますが、実装にはかなりのコードが必要になる可能性があります.
この授業では、GLSurfaceViewおよびGLSurfaceView.Rendererを最も省くコードで実現することを示します.
インベントリファイルにOpenGL ESの使用を宣言する
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" />
テクスチャ圧縮フォーマットの詳細については、OpenGL開発ガイドを参照してください.
OpenGL ESのActivityを作成
通常のアプリケーションと同様にOpenGL ESも同様にユーザインタフェースを必要とする.主な違いは、一般的なアプリケーションではActivityにレイアウトを入れるだけでよいことです.OpenGLESを使用するアプリケーションでは、通常のTextViewのような基本コントロールのほかに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);
    }
}
Note:OpenGL ES 2.0はAndroid 2.2以上のバージョンで実行する必要があります.アプリケーションの最低バージョンがそれ以上であることを確認してください.
GLSurfaceViewオブジェクトの構築
GLSurfaceViewは、OpenGL ESグラフィックをユーザーが描画できる特殊な領域です.それ自体はあまり多くのことをする必要はありません.実際、グラフィックの描画はGLSurfaceView.Rendererによって制御されています.実際には、このクラスを継承するのではなく、オリジナルのGLSurfaceViewインスタンスを直接作成してみたいかもしれません.そうしないでください.このクラスを継承してタッチイベントをキャプチャする必要があります.関連情報はResponding to Touch Eventsコースで説明されています.
本質的にGLSurfaceViewのコードは少ないので、それを迅速に実現するために、このオブジェクトを使用するActivityで内部クラスを作成するのが一般的です.
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の追加オプションは、レンダリングモードを設定することです.
// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
このオプションは、requestRender()メソッドが呼び出されるまでGLSurfaceViewフレームワークの再描画を阻止します.これにより、アプリケーションの効率が向上します.
レンダラークラスの構築
クラスGLSurfaceView.Rendererは本当に面白いところです.このクラスはGLSurfaceViewで描かれたものを制御することができる.内部には3つの方法があり、この3つの方法はAndroidシステムによって呼び出され、GLSurfaceView上でどのように描画するかを計算するために使用されます.
  • onSurface Created()OpenGL ES環境を設定するときに1回呼び出されます.
  • onDrawFrame()viewの描画のたびに呼び出されます.
  • onSurfaceChanged()は、ビューの構造が変更されたときに呼び出されます.例えば、デバイスの画面方向が変更されました.

  • 以下はOpenGLESレンダラーの最も基本的な実装です.ここでは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を使って黒い背景を描きました.これらのコードは何も面白いことをしていませんが、これらのクラスを作成することで、OpenGLでグラフィックを描くための基礎を築くことができます.
    Note:OpengGL ES 2.0 APIを使用する場合、なぜこれらの方法にGL 10というパラメータがあるのか疑問に思うかもしれません.これら2.0 APIで繰り返し使用される署名方法は、Android frameworkのコードを簡便に保つためである.
    OpenGL ES APIに詳しい場合は、OpenGL ESの環境を設定し、グラフィックの描画に着手することができます.いずれにしても、OpenGLの詳細については、次のセクションのヒントを参照してください.