gallery3d(4)


gallery 3 dコード分析のglsurfaceview
作者:劉鵬
日付:2010-04-01
この論文ではandroid SDKが提供するGlSurfaceViewを用いてOpenGL ESの開発を行う方法について簡単に説明した.

概要

SDKのandroid.opengl.GLSurfaceViewクラスには、次の機能があります.
  • OpenGL ESとViewシステムの間に連絡を確立する.
  • により、OpenGL ESはActivityライフサイクルで動作することができる.
  • は、適切なframe buffer画素フォーマットを選択することができる.
  • は、スムーズなアニメーションを実現するために、個別のレンダリングスレッドを作成し、管理します.
  • はdebuggingツールおよびAPIを提供する.

  • 簡単なGLSurfaceViewアプリケーション

    package com.example.android.apis.graphics;
    
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    import android.app.Activity;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    
    public class ClearActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mGLView = new GLSurfaceView(this);
            mGLView.setRenderer(new ClearRenderer());
            setContentView(mGLView);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mGLView.onPause();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mGLView.onResume();
        }
    
        private GLSurfaceView mGLView;
    }
    
    class ClearRenderer implements GLSurfaceView.Renderer {
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // Do nothing special.
        }
    
        public void onSurfaceChanged(GL10 gl, int w, int h) {
            gl.glViewport(0, 0, w, h);
        }
    
        public void onDrawFrame(GL10 gl) {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        }
    }
    
    
    このプログラムの機能は簡単で、フレームごとに画面を黒く設定します.しかし、Activityライフサイクルで完全に動作するOpenGLプログラムです.Activityが一時停止すると、レンダリングが一時停止します.activityが続行されると、レンダリングが続行されます.このプログラムは非インタラクティブなdemoプログラムとして使用できます.ClearRenderer.onDrawFrame()インタフェースにOpenGL呼び出しを追加して多くの描画を行います.GLSurfaceView.Renderインタフェースには、次の3つの方法があります.
  • onSurface Created():このメソッドはレンダリング開始前に呼び出され、OpenGLESのペイントコンテキストが再構築されたときに呼び出されます.activityが一時停止するとペイントコンテキストが失われ、activityが継続するとペイントコンテキストが再構築されます.また、textureなどの長期にわたって存在するOpenGLリソースの作成もここで行われることが多い.
  • onSurfaceChanged():surfaceのサイズが変更されると、このメソッドが呼び出されます.ここでviewportを設定することが多い.あなたのcameraが固定されている場合は、ここでcameraを設定することもできます.
  • onDrawFrame():フレームごとにこの方法で描画されます.描画時にglClear関数を呼び出してframebufferを空にし、OpenGL ESを呼び出すインタフェースで描画します.

  • 処理方法の入力

    は、ゲームのようなインタラクティブなアプリケーションを開発する場合、通常、GLSurfaceViewをサブクラス化する必要があり、これにより入力イベントを取得することができる.次に、
    package com.google.android.ClearTest;
    
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    import android.app.Activity;
    import android.content.Context;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    import android.view.MotionEvent;
    
    public class ClearActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mGLView = new ClearGLSurfaceView(this);
            setContentView(mGLView);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mGLView.onPause();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mGLView.onResume();
        }
    
        private GLSurfaceView mGLView;
    }
    
    class ClearGLSurfaceView extends GLSurfaceView {
        public ClearGLSurfaceView(Context context) {
            super(context);
            mRenderer = new ClearRenderer();
            setRenderer(mRenderer);
        }
    
        public boolean onTouchEvent(final MotionEvent event) {
            queueEvent(new Runnable(){
                public void run() {
                    mRenderer.setColor(event.getX() / getWidth(),
                            event.getY() / getHeight(), 1.0f);
                }});
                return true;
            }
    
            ClearRenderer mRenderer;
    }
    
    class ClearRenderer implements GLSurfaceView.Renderer {
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // Do nothing special.
        }
    
        public void onSurfaceChanged(GL10 gl, int w, int h) {
            gl.glViewport(0, 0, w, h);
        }
    
        public void onDrawFrame(GL10 gl) {
            gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        }
    
        public void setColor(float r, float g, float b) {
            mRed = r;
            mGreen = g;
            mBlue = b;
        }
    
        private float mRed;
        private float mGreen;
        private float mBlue;
    }
    
    
    というアプリケーションは、フレームごとにスクリーンを空にする.tap画面の場合、画面の色を変更します.ここはonTouchEvent()にはqueueEvent()が使用されています.queueEvent()メソッドは、UIスレッドとレンダリングスレッドとの間で通信するために使用されます.synchronizedメソッドのようなJavaスレッド通信技術も使用できますが、queueEventの最も簡単なスレッド通信方法です.

    その他のGLSurfaceViewの例

    Android SDKのAPI Demoの例プログラムには多くの例があります.
  • GLSurfaceView
  • Kube
  • Translucent GLSurfaceView:透明バックグラウンド
  • Textured Triangle:テクスチャマップ
  • Sprite Text:textureにテキストを書き3 Dシーンに表示する
  • Touch Rotate:回転3 Dオブジェクト
  • Surfaceを選択

    GLSurfaceViewは、インタフェースがsurfaceを選択できるタイプを提供します.デフォルトでは、GLSurfaceViewは16ビットのRGB frame bufferを使用します.16ビットの深さがあります.Translucent GLSurfaceViewの例では、透明性を実現するためにAlphaチャネルが必要です.GLSurfaceViewは、setELSurfaceChooser()メソッドを提供し、surfaceを選択します.RGB(565)の16ビットframebufferを選択し、インタフェースは以下の通りである:
    setEGLConfigChooser(boolean needDepth)
    
    
    red,green,blue,alphaおよびdepthをカスタマイズするには、
    setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)
    
    
    が独自に実装したEGLConfigChooserを使用し、ゲーム、シミュレーションなどの多くの3 Dアプリケーションが持続的にレンダリングされたアニメーションであり、3 Dアプリケーションの中には反応式(reactive)であり、受動的に待つことが多い.ユーザが動作してから反応する.このようなアプリケーションでは、スクリーンをレンダリングし続けるのは時間の無駄です.反応式のアプリケーションを開発すると、次の方法
    setEGLConfigChooser(EGLConfigChooser configChooser)
    
    
    を呼び出して持続的なレンダリングを停止することができる.
    GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);
    
    
    が呼び出されると、プログラムは画面を再レンダリングする.

    持続レンダリングモード&通知レンダリングモード

    GLSurfaceView.setDebugFlags()メソッドは、OpenGL ES呼び出しのデバッグを支援するlogまたはエラー検出をアクティブにすることができます.具体的にはGLSurfaceViewのコンストラクタでsetRender()を呼び出す前にGLSurfaceViewを呼び出す.setDebugFlags()でいいです.次に例を示します:
    GLSurfaceView.requestRender()
    
    
    元の場所:http://www.linuxgraphics.cn/android/gallery3d_glsurfaceview.html