2013年05月31日

なぜテクスチャサイズは2の累乗なのか

作ってて普通に192x192のテクスチャでいい感じだったんで
別にそんな必要ねーじゃんとか思ってたんですが、
いろいろやってて、なんとなく理由が分かって来ました。

1.ポリゴンのテクスチャは明示するまで同じテクスチャを使う

これびっくりしました。3Dってのは、テクスチャをポリゴンに指定して、
後はそのポリゴンをごちゃごちゃいじるんだと思ってたので。
Direct3Dはそうではなく、テクスチャステージってのがあって、
そこにテクスチャと描写方法を指定して、全ポリゴンがそれを使うって処理なんですよ。

2.1.の理由によりテクスチャを使いまわす必要がある

毎フレームごとにテクスチャ変えてちゃしんどいでしょうね。
まあポリゴンに色(含透明度)と位置を指定できるんで、
大体は使いまわせそうではあります。

3.2.の位置指定がfloatである

これ。これが問題。浮動小数点です。(0.0〜1.0で指定)

4.浮動小数点(IEEE754)は分母が2の累乗でなければ有限小数として表現できない

意味不明な感じですが、まあ要するにそういうこと。
浮動小数点で==判定するなってやつですね。こんなの。

// 1/100をセット
double denom = 1.0 / 100, val = 0;

// 1/100を100回足す
for( int i = 0; i < 100; i ++ ) val += denom;

// 判定
if( val == 1 ) { /* ここは絶対に処理されない */ }


処理されない理由は、1/100を2進数で表現すると循環小数になるので、
変数に代入する際、丸めないと入りません。(四捨五入だったかな)
その時点で誤差になるので、それを足しても誤差があるままだよってことです。

で、これをテクスチャに用いると、その誤差分ずれることがある。
この誤差は浮動小数点の仕様なんで仕方ないです。

でも、誤差を出させない方法があります。

それが有限小数だけ使うこと。
2進数における有限小数になる条件は、分母が2の累乗である分数です。

てことで、テクスチャのサイズは2の累乗なんですねえ。
位置を整数/サイズで指定する限り、必ず有限小数になるので、
ずれないですもんねえ。なるほどなあ。

※)有限小数についてもう少し調べたら、「分母が基数の素因数で構成されていること」
らしいです。なるほど、2進数は2しかないし、10進数だと2と5になるんですね。

※2)蛇足ですが、この手の説明をする時、必ず5の倍数かつ2の累乗でない数を分母にするはずです。
【プログラミングの最新記事】
posted by Nick at 20:27| Comment(0) | TrackBack(0) | プログラミング
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/68664570

この記事へのトラックバック