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) | プログラミング

2013年05月25日

VB.NETの文字列

ちょっと気になったこと

'初期化
Dim lst As New List(Of String) From {"hello", "world"}

'最初のやつを持ってくる
Dim lzt As String = lst(1)

'typo(lstとlztを勘違いした)
MsgBox(lzt(1))


まあ実際こんな変数名にはしないでしょうけど、
これ、コンパイルエラーになるもんだと思ってました。

でもこれ通っちゃうんです。

Stringクラスの()演算子、Charを返してくれるらしいんですよ。

・・・な、なんていらない子・・・

続きを見る

タグ:Program VB.NET
posted by Nick at 05:09| Comment(0) | TrackBack(0) | 小ネタ

2013年05月22日

WindowsXPサポート終了について思うこと

最初にWindowsに触ったのはたしか98。
それからNT4を知って、2000に感動して、XPに移行して以来、
ずーっとXP使って来ましたねえ。

MSが好きだった(というかものすごいことを成し遂げたと思ってた)のは
いつまでだったでしょうか。

理由はただ一言「OSを統一した。」
それだけなんですが、理論でも空想でもなく実戦で、やった。
これだけで作り手としては物凄く有難いのです。
※88とか98とかX68kとかMSXとかいろいろありましたからねえ

が、自らそれを否定してますね、2000以降のWindowsは。

そもそもOSなんてものは、根本的な欠陥がない限り、
メジャーバージョンアップすべきものじゃないでしょう。
(企業としてはそれでも作らなきゃいけないのは分かるんですが)

さて、XPですが、どうなるでしょうね。

個人的に使うのに支障はありません。サポート云々はどうでもいいです。
私個人のPCは「OSがXPだと動かない」状態になるまでXPを使うでしょう。

しかし世間がどうなるかは話が全然違います。
※世間=使う個人+作る個人+使う企業+作る企業

終了は2014年の4月でしたか。その時にはある程度
世間の答えは出ているでしょうから楽しみです。

現時点では、少なくとも作る個人(≒私)側がXPを無視することは殆ど無いです。
posted by Nick at 20:19| Comment(0) | TrackBack(0) | OS