Nanashi-softプログラマ専用AndroidでOpenGL ES 2.0プログラミング


◇AndroidでOpenGL ES 2.0プログラミング -Android 2.1に対応-

このブログで記載したプログラムは,Android 2.2以降になっていました
その理由は,Java側で記述している setEGLContextClientVersionメソッドが 2.2以降サポートの為です

NDKのみを使用する場合,Android 2.0以降であれば OpenGL ES 2.0をサポートしています(Javaで記述する場合は 2.2以降になります)
また,国内端末は Android 2.1のものが多く,サポートしたいものです(2011/6現在では,ほとんどの端末が2.2以降にアップデートされました)

android-ndkにサンプルが入っています
android-ndk/samples/hello-gl2
AndroidManifest.xmlファイルを見ると,minSdkVersion="5"になっており,API Level 5=Android 2.0対応になっています

このサンプルの中から,ContextFactoryクラスをそのままコピペします
↓Javaソースの一番下とかに,ログ出力がなんかビルド通らないのでコメントアウトして貼り付けてみたところ
class ContextFactory implements GLSurfaceView.EGLContextFactory {
    private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
    public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
//        Log.w(TAG, "creating OpenGL ES 2.0 context");
//        checkEglError("Before eglCreateContext", egl);
        int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
        EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
//        checkEglError("After eglCreateContext", egl);
        return context;
    }

    public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
        egl.eglDestroyContext(display, context);
    }
}
意味はよくわかんないです('-'*)
だって,eglCreateContextメソッドをリファレンスで見ても『attrib_listなの。型はint型配列なの』としか書かれて 無いし。。。
識別子一覧表がそこに載っていないのはドキュメントの不備でしょう
0x3098とか何の数値なんだと(*'-')

これを setEGLContextClientVersionの代わりに setEGLContextFactoryで呼び出します
public class sgca7 extends Activity {
	public native void NDKonTouch(int mode2,float cx,float cy);
	public native void NDKonSizeChanged(int width, int height);

    static {
    	System.loadLibrary("sgc-jni");
    }

    GLSurfaceView glview;
	sgcRenderer mGLRenderer;

    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);

    	getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        glview = new GLSurfaceView(this);

//        glview.setEGLContextClientVersion(2);
        glview.setEGLContextFactory(new ContextFactory());

        glview.setRenderer(new sgcRenderer());
        setContentView(glview);
	}

    public boolean onTouchEvent(MotionEvent event) {
	}
}
これで Android 2.2以降の命令を使用していないので,2.0以降で動作します


あと,もう1つ注意点があります
プロジェクト生成時に,API Levelを 8に設定してしまった場合です
これを Android 2.1端末でダウンロードすると『解析エラー』と表示されてインストールを行えません

Eclipse上から,AndroidManifest.xmlファイルをダブルクリックして開いて,
『Uses Sdk』と表示されているのをクリックすると,右に Min SDK versionが表示されるので,7 (Android 2.1)にして保存します


これで初代Xperiaで動作するようになりました('-'*)


TOPプログラマ 専用AndroidでOpenGL ES 2.0プログラミング

メイナの実験場~これくらいなら大丈夫でしょうか~メイナの実験場~素朴なツインテ娘+たくし上げ~