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 プログラミングガイド Aaftab Munshi Dan Ginsburg Dave Shreiner アフタブ・ムンシ ダン・ギンズバーグ デーブ・シュライナー 松田 晃一 ピアソン桐原 2009-11-01 |
関連記事