SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

レイトレースでのZバッファの作り方

Zバッファの表示機能を作ってみました.
レイトレでは視点から物体との交点までの距離は,直線の式のパラメータとして求められますが,それは視点からの距離であって,一般的に言うZバッファとは違います.

たとえばこの画像などでは,平面の部分を見てみると,同じZ値であるべき部分が曲がってしまっています.(視点からの距離という意味ではコレで正しいのですが・・)


なので,視点からの距離ではなく,奥行きの値を求めるようにしました.
要は基本的な三角関数の話です.

この図のように,レイトレでの求められる,視点から交点までの距離とは注視点方向からそれたものとなるため,この値をZバッファにしようとすると歪んだものとなってしまいます.
求めたいZバッファの値は視点から図の赤い点までの距離なので,この値を計算します.
で,まず視点から交点までの距離ですが,これは物体に向けて飛ばした視線ベクトルと交点までの距離のパラメータtで求められます.
もっと単純にだと,cross-eyeのベクトルの長さでも同じですね.

で,図のようにこの値に注視点方向とのずれの角度θの余弦をかければ注視点方向への距離が求まります.

cosθはrayと注視点方向lookatのベクトルの内積で計算できます(これらのベクトルを正規化していれば・・).

このようにして計算したZバッファの画像は,下の右側のようになります.