別にそんな必要ねーじゃんとか思ってたんですが、
いろいろやってて、なんとなく理由が分かって来ました。
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の累乗でない数を分母にするはずです。