2013年10月22日火曜日

Androidアプリ開発:テクスチャの勉強

AndroidではグラフィックスにOpenGL ESが実装されています。OpenGLは以前触っていたんで、個々の関数については「昔、聞いたことあるな~」と思いながら、サンプルを打ち込んでみて思い出しながら作業を進めます。
pngのbitmapをテクスチャとして貼るサンプルを作ってみましたが、これがどうしてもうまくいきません。テクスチャが本来表示されるはずのところが「真っ黒」になります。最初は光源の設定か、あるいはテクスチャを張るポリゴンの法線ベクトルの問題か?と思ったんですが、サンプルはそのあたりはデフォルトにまかせており、特におかしなことはしていません。
最初、bitmapを自分で用意したとき、適当なサイズで作ってしまいましたが、OpenGL ESでは2のべき乗でないといけない制限があるとのこと。そこで512x512で作り直しましたが、状況は変わらず。(大昔のOpenGLではそんな制限がありましたが、だいぶ前に自由になっていました。OpenGL ESは組込み用なので、そのあたりメモリの制限があるんでしょうね。)

さんざん悩んで、google先生にどう質問したらいいか何度か試しているうちに解決法がのっているサイトを見つけました。2012年7月くらいのAndroidの記事で、bitmapなどのresourceを保持するフォルダに、res/drawable-tvdpiというものができたとのこと。これまでアイコンのサイズを3通りくらい保持するためにldpi/mdpi/hdpiとかあったんですが、これら以外に「抽象ドット密度」というものができて、これを画像表示(テクスチャも)に使うとのこと。いやらしいことに、デフォルトでは作成されないフォルダ、res/drawable-tvdpiというフォルダに画像を保存しておくのが前提なんだそうです。そして別のサイトの情報で、さらにやっかいなことに今回最初にデバッグに使ったのがNexus7なのですが、この端末がtvdpiを実装されているtvdpi端末(表現が正しいかわかりませんが・・・)であり、ここに該当する画像ファイルがないと、hdpiにあるファイルを「自動でリサイズ」するとのこと。つまり、2のべき乗で作成しておいても勝手にリサイズされてしまい、それがくずれてしまって表示がされなくなってしまいます。(試しに別のAndroid端末をつないでみたら、表示されました)

解決法としては、res/drawable-tvdpiに2のべき乗の画像ファイルを保存しておくことになります。これでどの端末でも同じように表示されるようになります。
ただこの情報が書いてあったサイトでは、今度Android4.3ではOpenGL ES 3.0がサポートになり、テクスチャ画像の2のべき乗の制限がなくなるという情報がありました。自分のNexus7はAndroid4.3になっていますが、テクスチャ画像は2のべき乗でないとだめでした。まだダメなのかもしれません。

0 件のコメント:

コメントを投稿