【6800Ultra】 nVIDIA厨 vs ATi厨 Part5 【X800XT】

このエントリーをはてなブックマークに追加
222Socket774
日常的にシェーダを書く立場にいる者です。

最近、各所で精度に関するいい加減な憶測が出回っているようです。
本来こういった知識は開発に関わる人間が理解していれば問題無いことで、
シェーダを扱う人が誤解しなければ良いと思って傍観していました。
ただ、こういった BBS での発言ですと、
一般ユーザの方に誤った知識を植えつけかねないと感じましたので、
一応指摘させていただくことにしました。
#プログラマでない方には判りにくい部分もありますし


>32bitデータのときには必要な部分を切り捨ててチート。
PixelShader 2.0/3.0 のマイクロソフトの要求仕様としては、
部分精度オプション(_pp)未使用時(つまり高精度演算時)の
内部演算精度は少なくとも fp24(s16e7) 以上となっています。
また、部分精度オプション指定時の内部演算精度は
少なくとも fp16(s10e5) 以上となっています。

つまり、仕様上のピクセルシェーダの内部演算精度は、
fp24 で良いということになります。
#実際、ゲーム用途で fp24 で問題になる事はまずありません

また、シェーダ内では、部分精度(_pp)オプションを指定することで
低精度演算を許可することができますが、これはあくまでヒント指定であり、
決して fp16 を強制するものではありません。
つまり、シェーダを書く人間が
「最悪 fp16 の精度があれば許容できるから、出来るだけ速い演算にしてくれ」
と要求したい場合に、ハードウェアに低精度演算の許可を与えるもので、
fp24/fp32 などのより高い精度でも充分高速に演算を行えるのであれば、
それに越した事はありません。

「部分精度を付けたのに fp24 以上で計算された。意図しない動作だ。」
などと頓珍漢な発言をするプログラマはいません。
#単に「演算精度よりは速度を重視して欲しい」というだけのことです。
223Socket774:04/05/11 00:25 ID:+H6kZirf
> 16bitデータのときには不要な部分を追加してチート
> チートしても16bitなら16bit出力。
> 描画は開発者の意図したとおりにならない大チート。

というのも、情報工学の基礎を理解していればあり得ない発言です。

ここでは詳しい説明は避けますが、fp16 演算を多く繰り返せば繰り返す程、
誤差の蓄積により精度が fp16 よりも悪くなってゆくのは常識です。
したがって、たとえ外部精度(ピクセルバッファフォーマット)が全て fp16 としても、
内部演算精度が高い方が最終的な出力の精度も高くなります。
#プログラマが低精度演算を許可している場合、
#プログラマ側としてはそういった演算誤差の蓄積も許容しているということです

まぁ他にも、そもそも fp16 演算自体チートでも何でもありませんし、
チートという言葉自体おかしな使われ方をしていたりしますが、
敢えて指摘する程でも無いと思いますので、これ以上は触れないことにします。


PixelShader のマイクロソフトの要求仕様については、以下をご参照ください。
http://spin.s2c.ne.jp/quick003.html
↑のページ内を「精度に関する要求仕様」で検索

もしくはその情報ソースとなっているメーリングリストでの発言元
http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0302b&L=directxdev&D=1&F=&S=&P=13774
224Socket774:04/05/11 00:26 ID:orBn6cG3
PixelShader 2.0と3.0も見た目や出来る事は変わらない
225Socket774:04/05/11 00:33 ID:+H6kZirf
長々と書き込んですみませんでした。
PixelShader 特にDirectX9での仕様について、
nVIDIAファンの方の誤解(?)が多い様なので書かせていただきました。

また繰り返し制限についても、2.0c(b)の重さでさえ
実際のアプリで使いこなすのには数年かかると思います。

あと3Dcは職場の人間が喜んでました、
もし可能ならばDirectX10で規格に盛り込んで欲しいですね。