さて、前にこのコーナーで取り上げた時何が謎だったかというと、
この新機能W-Bufferingとは、
結局何なのか?
そして今までと正確に何が違うのか?
ということである。
そして私は前回の時点では、
DirectX5以前のZ-Bufferでは、
Zテストに使うZ座標は視点座標系でのZ座標をそのまま使っていた
(正確には線形に写像するが)と思い込んでいた。
というのも、ほとんどの情報では、
「W-Bufferはこれまでのように z を使うのではなく、
1/z を使うため、近距離のZ精度が高くなる」と書かれていたからだ。
前にも書いたが、Zテストに z をそのまま使うと、
投資変換後のポリゴンの平面性が保持されない。
そのため、
線形補間では正確なz値を計算できず、z方向に長いポリゴンとそうでない
ポリゴンが相関(突き抜けたりとかね)する場合などに、正確なzテストを実行できず、
ポリゴンが破綻する可能性がある。
それで、
「DirectX5以前て、なんていい加減な計算方法を取っているんだ」
などと思ってしまった訳だ。
ところが情報を集めて結果、DirectX5以前でも 1/z で
Zテスト用の座標を計算していることが分かってしまった。
つまり、別にいい加減な計算ではなかったのだ。
ということは、どうやらW-BufferingとZ-Bufferの違いとは、
「テストそのものを浮動小数点で行うか否か」
ということだけのようである。
浮動小数点で行うと、例えばフレームバッファ上のマウス座標から
表示されているポリゴンの座標値を逆算したい場合などに、
より精度を高めることができるだろう。
しかし、それ以外にはあまり大きなメリットは思い付かない。
浮動小数点だとzバッファに最低32bit必要になるが、
32bitもあれば、整数でもかなりの精度を期待できるからだ。
近クリップから遠クリップまでの範囲で、
約42億段階ものz座標値に分割できるのである。
これで精度が低いというのは通常考えられないだろう。
W-Bufferingによる劇的な変化というのはあまり無いのではなかろうか?
とまあ、これは個人的な意見。
ところで、W-Bufferingについての
正確な情報があまりに乏しいと感じるのは私だけだろうか?
上でも書いたが、たいがいの記述では
「W-Bufferingはこれまでのように z を使うのではなく
1/z を使うため、近距離のZ精度が高くなる」
となっているのである。
DirectX5以前でも 1/z を使っていたのなら、このような記述は明らかに誤りである。
しかも、浮動小数点がうんぬんという話はほとんど出て来ない。
何故なんだろうねぇ。
ホームページに戻る |