Microsoft DirectX 8.0 (C++)

視点からの相対深度 対 Z ベースの深度

深度バッファ内での z 値の不均等なばらつきによって生じる、フォグの不自然なグラフィックス効果を抑えるために、ほとんどのハードウェア デバイスでは、ピクセル フォグに z ベース深度値ではなく視点からの相対深度を使用する。視点からの相対深度とは、本質的には同次座標セットからの w 要素である。Microsoft® Direct3D® は、デバイス空間座標から RHW 要素の逆数を取得して真の w を再生成する。デバイスが視点との相対フォグをサポートしている場合、IDirect3DDevice8::GetDeviceCaps メソッドを呼び出すと、そのデバイスは D3DCAPS8 構造体の RasterCaps メンバに D3DPRASTERCAPS_WFOG フラグを設定する。

  リファレンス ラスタライザを除き、ソフトウェア デバイスは常に z を使用してピクセル フォグ エフェクトを計算する。

視点との相対フォグがサポートされているとき、設定された射影行列でデバイス空間の w 値に対応する、ワールド空間の z 値を生成する場合、システムは z ベース深度よりも視点からの相対深度を優先して自動的に使用する。射影行列を設定するには、IDirect3DDevice8::SetTransform メソッドを呼び出し、D3DTS_PROJECTION 値を使用し、目的の行列を表す D3DMATRIX 構造体を渡す。射影行列がこの要件に対応していない場合は、フォグ エフェクトが正しく適用されない。適切な行列の生成の詳細については、「W バッファに有効な射影行列」を参照すること。「射影トランスフォームとは」で説明するパースペクティブ射影行列は、適切な射影行列を生成する。

Direct3D では、現在設定されている射影行列を使用して w ベース深度の計算を実行する。したがって、アプリケーションで Direct3D トランスフォーム パイプラインを使用しない場合であっても、目的の w ベース機能を取得するために適切な射影行列を設定しておく必要がある。

Direct3D は射影行列の第 4 列を調べる。係数が [0,0,0,1] (アフィン射影) の場合には、システムは z ベースの深度値をフォグに使用する。この場合、デバイス空間の線形フォグ エフェクトの開始距離および終了距離を指定する必要もある。この範囲は、ユーザーに最も近いポイントを 0.0 とし、最も遠いポイントを 1.0 とした範囲である。