2011.11.24
【Android NDK】OpenGLの画像サイズの問題
IS03とかだと2乗倍の画像しか読めない問題がある。
どんな画像でも対応できるようにしたい。
これをソフトウェア側で解消することができうないだろうか?
手順としてはこんな感じ。
1. 画像の読み込み 2. ちょうどよいサイズへメモリ上で変換 3. これを転送する 4. 描画時には実寸指定ができるようにする。
2.は640*480の画像であれば1024*512の画像を作成し原寸コピーするということ。
4.のソース的にはこんな感じになるかな?
/** * 画像情報構造体 */ typedef struct { int nOrgSize[2]; //画像の実際のサイズ int nVirSize[2]; //実質の転送幅 nOrgSizeの次の2乗倍 } IMAGE_INFO; //実際の横幅のUV値を求める int nfWidth = FIXED( nOrgSize[0] ) / nVirSize[0]; //これが転送するUV値 nUv[0] = nPos[0] * nfWidth;
たとえば、画像サイズを512から256に代えたところで
描画には何も影響しないわけです。
UV値はfloatだろうとfixedだろうと0~1の範囲にする必要がある。
ということはテクスチャサイズを勝手に拡大縮小してもプログラム側では一切影響しない。
なので、読み込んだ画像を2乗倍のサイズへ変更して転送。
メイン処理側は何も意識せずにもちゃんと表示されるという寸法です。
案1)
・メモリがやたらと食われる可能性がある
・スケールしないのできれいに表示される
・3DみたいなUV値指定だとUV変換が必要になる可能性がある。
案2)
・スケール処理が必要。
・テクスチャの拡大縮小の関係でおかしくなるかもしれない。
どちらも一長一短なのでやるなら両方ともできるように
ハイブリット式にしたほうがよさそうな感じはある。
結論としてはすべての画像を作る際には2乗倍で作っておけば
こんなことを考えなくても済むと言うことです。
だけど、いろんなものを対応するという部分ではやっておいたほうがいいんだろうね。
Open GL ES 2.0 プログラミングガイド Aaftab Munshi Dan Ginsburg Dave Shreiner アフタブ・ムンシ ダン・ギンズバーグ デーブ・シュライナー 松田 晃一 ピアソン桐原 2009-11-01 |
関連記事