W-Buffering
2nd

98/08/02(日)  − W-Buffering 2nd − 謎は解けた...ってか?

 DirectX6の新機能である W-Buffering。 前は結局正確な情報を得られないままに終ってしまったが、ついにその謎が解けた。 とか言ったりしてみたが、実際にはあの記事を書いた後すぐに分かったことなので、 今頃になってここに書くのは遅すぎるという話もあるが....お許しを...m(__)m

 さて、前にこのコーナーで取り上げた時何が謎だったかというと、 この新機能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 を使っていたのなら、このような記述は明らかに誤りである。 しかも、浮動小数点がうんぬんという話はほとんど出て来ない。
 何故なんだろうねぇ。