2011.12.13

【Android NDK】AndroidSDK2.1ベースでOpenGL ES 2.0を使用する

使えるらしいがだいぶ特殊なことが必要になります。

普通では使えないOpenGL ES 2.0

まず普通にOpenGL ES 2.0の使用準備をしてコンパイルをすることで実行できるようになります。

しかし、実行するとエラーになります。

AndroidSDKでのOpenGL ES 2.0を使用すると宣言しないと使えない。

//OpenGL2.0として呼び出す
setEGLContextClientVersion(2);

しかしこれはAndroidSDK2.2から使える機能になる。

どうにか使えるようにする

では、AndroidNDKで2.1ベースとして考えたときに使えないかというとそうでもないらしい。

サンプルを見る限りだとApiレベル5でOpenGL ES 2.0を使っている。
使えなくはないのだが、ちょっと特殊なことがが必要になる。

まずはこんなクラスを作成する。

import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import android.opengl.GLSurfaceView;

/**
 * NDKでOpenGLを使うことができるようになる魔法のクラス
 */
public class ContextFactory implements GLSurfaceView.EGLContextFactory
{
	private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
	
	public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig)
	{
		int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
		EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
		return context;
    }

	public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context)
	{
		egl.eglDestroyContext(display, context);
	}
}

上記のクラスをこんな感じに使う。

//OpenGL2.0として呼び出す
//setEGLContextClientVersion(2);

//Android2.1用OpenGL2.0への切り替え
setEGLContextFactory( new ContextFactory() );

これがNDKのサンプルで行っている方式らしい。
ContextFactoryクラスについては呪文でいいと思う。


Android2.1を切り捨て、Android2.2移行とするとこんなことも
必要ないのでしょうけど時代はまだAndroid2.1だしね。

これだけの手間で使えるのであれば万々歳でしょう。

Open GL ES 2.0 プログラミングガイド Open GL ES 2.0 プログラミングガイド
Aaftab Munshi Dan Ginsburg Dave Shreiner アフタブ・ムンシ ダン・ギンズバーグ デーブ・シュライナー 松田 晃一

ピアソン桐原 2009-11-01
売り上げランキング : 32973

Amazonで詳しく見る by G-Tools

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

関連記事

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>