読者です 読者をやめる 読者になる 読者になる

eaglesakuraの技術ブログ

twitterから派生した、技術的にちょっと込み入った話題とか。

GLTextureViewを公開しました

Android 4.0(API Level 14)からTextureViewというViewが登場し、OpenGL ESの応用範囲が格段に広くなりましたが、GLSurfaceViewに相当する補助クラスが未だに登場していません。

Google的には必要ないという考えかもしれませんが、SurfaceViewよりもTextureViewでOpenGL ESを扱ったほうが非常に楽なため、俺俺GLTextureViewクラスを公開しました。

GLTextureView(github)

詳細はREADME.mdにも記述されています。

GLSurfaceViewとの相違点

使い方はGLSurfaceViewとほぼ変わりありません。 ですが、おおまかに次の点が異なります。

  • リソース解放用にonSurfaceDestroy()を追加した
  • requestRender()の設計が異なる
    • GLSurfaceViewの場合 -> レンダリングスレッドへpostされるため、非同期実行される
    • GLTextureViewの場合 -> その場でレンダリングと画面への反映が行われる
  • 初期化用のメソッド名が異なる
    • 基本的にEnumを定義し、それをメソッドへ渡すようにしています

サンプルコード

例えば、GLTextureViewでOpenGL ES 2.0を初期化し、レンダリングスレッドを作成するコードは次のようになります。


public class SimpleGL20Activity extends Activity implements Renderer {
    static final String TAG = SimpleGL20Activity.class.getSimpleName();

    GLTextureView glTextureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        glTextureView = new GLTextureView(this);

        // Setup GLTextureView
        {
            glTextureView.setVersion(GLESVersion.OpenGLES20); // set OpenGL Version
            //            glTextureView.setSurfaceSpec(SurfaceColorSpec.RGBA8, true, false); // Default RGBA8 depth(true) stencil(false)
            //            glTextureView.setRenderingThreadType(RenderingThreadType.BackgroundThread); // Default BackgroundThread
            glTextureView.setRenderer(this);
        }
        setContentView(glTextureView);
    }

    @Override
    protected void onPause() {
        glTextureView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        glTextureView.onResume();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.d(TAG, "onSurfaceCreated");
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.d(TAG, String.format("onSurfaceChanged(%d x %d)", width, height));
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        GLES20.glClearColor(0, (float) Math.random(), (float) Math.random(), 1.0f);
        GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    }

    @Override
    public void onSurfaceDestroyed(GL10 gl) {
        Log.d(TAG, String.format("onSurfaceDestroyed"));
    }

}

日経ソフトウエア 2013年 04月号

日経ソフトウエア 2013年 04月号

初めてのOpenGL ES

初めてのOpenGL ES