Android系女史 -2ページ目

Android系女史

Android開発など雑多なプログラムの愚痴でもしています。

描画できたのはいいのだけれど
凄い勢いで画面がちらつく。

GLSurfaceView.RendererのonDrawFrame()の中で
必要性があるときだけ再描画しているのだが
このonDrawFrame, 必ずバッファのスワップを行うらしい。

swapBuffersは自分で呼び出したいけど駄目なの?
ステンシルバッファがエミュレータで使えないのは諦めて描画周りの実装はじめ。
ついでにちゃんと確認はしてないけど
glBlendFuncSeparateOESもどうもエミュレータでは使えないっぽい。

GLSurfaceView.RendererクラスのonDrawFrameからjniの描画関数を呼び出して
画面描画できることが確認。
ステンシル使えないから見た目が変ですよ!

次はスレッド周りの実装とクリックイベントの取得かな。
あのーGL何回やっても呼ばれない

無事100以上のcppファイルをビルドしたところで
java->cppファイルを読み込もうとしているのですが
その前のところで躓き中。
いきなりiOSプログラムの移植をするのではなく
jniのサンプルを元にjava->cのプログラムでGL描画をしようとしただけなのですが
IllegalArgumentExceptionが表示される。

setEGLConfigChooserに渡す引数がよろしくないらしい。

setEGLConfigChooser(r, g, b, a, depth, stencil);
なのですがこの引数が
8, 8, 8, 8, 16, 0
だと動くのに
8, 8, 8, 8, 24, 8
だと動かない。

英語圏のBBSにエミュレータではステンシルが使えないから諦めろって書かれてありました……。
……stencilが使えないと困るんだけどな。
今手元に実機がないのにどうしよう。
外部ライブラリにlibzやlibPNGなどを使っているってことで
外部ライブラリのAndroid.mkの作成とライブラリのリンク。

普通のMakefileと同じで-lライブラリ名を書くのかと思いきや
LOCAL_SHARED_LIBRARIES := Android.mkに記入したモジュール名
でした。
OpenGL ES 1.xの方は
LOCAL_LDLIBS := -lGLESv1_CM
でリンク。

これでようやくcppファイルのビルドが終了。
……ndk-buildが遅い。100ちょっとのcppファイル数をビルドするのに凄い時間かかるよ。
Android.mkはMakefileと似たような感じなので
一度ビルドができるようになれば後はソースを追加するだけ。
1フォルダ1Android.mkにしようかと思ったけど
元のファイルがかなり細かくフォルダ分けされていたので
1プロジェクト1Android.mkに変更。
外部ライブラリもビルドしないといけないようなのでやらないと。

次の問題はOpenGLです。
OpenGL ESの1.xを使う場合は
#include <GLES/gl.h>
#include <GLES/glext.h>
OpenGL ESの2.0を使う場合は
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
をincludeしてやればいいらしい。

iOSのプログラムでOpenGL ES 1.x使用しているらしいのでAndroidもそれにあわせたのに
'glBindFramebufferOES'と'glBlendFuncSeparateOES'がないとエラーをはいてくる。
まさか使えないのかとglext.hの中身を見たら
それらの関数定義の前に

#ifdef GL_GLEXT_PROTOTYPES
の一文。
どうもGL_GLEXT_PROTOTYPESをdefineしてあげないとフレームバッファとかが使えないらしい。