2011.11.24

【Android NDK】OpenGLの画像サイズの問題

IS03とかだと2乗倍の画像しか読めない問題がある。

どんな画像でも対応できるようにしたい。
これをソフトウェア側で解消することができうないだろうか?

案1) UV値の補正を入れる

手順としてはこんな感じ。

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;
案2) 画像サイズのみ変更する

たとえば、画像サイズを512から256に代えたところで
描画には何も影響しないわけです。

UV値はfloatだろうとfixedだろうと0~1の範囲にする必要がある。

ということはテクスチャサイズを勝手に拡大縮小してもプログラム側では一切影響しない。

なので、読み込んだ画像を2乗倍のサイズへ変更して転送。

メイン処理側は何も意識せずにもちゃんと表示されるという寸法です。

結論

案1)
・メモリがやたらと食われる可能性がある
・スケールしないのできれいに表示される
・3DみたいなUV値指定だとUV変換が必要になる可能性がある。

案2)
・スケール処理が必要。
・テクスチャの拡大縮小の関係でおかしくなるかもしれない。

どちらも一長一短なのでやるなら両方ともできるように
ハイブリット式にしたほうがよさそうな感じはある。

結論としてはすべての画像を作る際には2乗倍で作っておけば
こんなことを考えなくても済むと言うことです。

だけど、いろんなものを対応するという部分ではやっておいたほうがいいんだろうね。

Open GL ES 2.0 プログラミングガイド Open GL ES 2.0 プログラミングガイド
Aaftab Munshi Dan Ginsburg Dave Shreiner アフタブ・ムンシ ダン・ギンズバーグ デーブ・シュライナー 松田 晃一

ピアソン桐原 2009-11-01
売り上げランキング : 32973

Amazonで詳しく見る by G-Tools

Pocket

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>