Platform SDK: DirectX |
深度バッファ内での z 値の不均等なばらつきによって生じる、フォグの不自然なグラフィックス効果を抑えるために、ほとんどのハードウェア デバイスでは、ピクセル フォグに z ベース深度値ではなく視点からの相対深度を使用する。視点からの相対深度とは、本質的には同次座標セットからの w 要素である (Direct3D は、デバイス空間座標から RHW 要素の逆数を取得して真の w を再生成する)。デバイスが視点からの相対フォグをサポートしている場合、IDirect3DDevice7::GetCaps メソッドを呼び出すと、そのデバイスは D3DPRIMCAPS の dwRasterCaps メンバに D3DPRASTERCAPS_WFOG フラグを設定する (GetCaps に渡す D3DDEVICEDESC7 構造体には、各種プリミティブの能力を記述する複数の D3DPRIMCAPS 構造体が含まれている)。
注 : リファレンス ラスタライザを除き、ソフトウェア デバイスは常に z を使用してピクセル フォグ エフェクトを計算する。
視点からの相対フォグがサポートされている場合、設定された射影行列でデバイス空間の w 値に対応する、ワールド空間の z 値を生成するとき、システムは z ベース深度よりも視点からの相対深度を優先して自動的に使用する (射影行列を設定するには、IDirect3DDevice7::SetTransform メソッドを呼び出し、D3DTRANSFORMSTATE_PROJECTION 値を使用し、希望の行列を表す D3DMATRIX 構造体を渡す)。射影行列がこの要件に対応していない場合は、フォグ エフェクトが正しく適用されない。適切な行列の生成の詳細については、「W バッファに有効な射影行列」を参照すること (「射影トランスフォームとは」で説明するパースペクティブ射影行列は、適切な射影行列を生成する)。
使用上の注意 : Direct3D では、現在設定されている射影行列を使用して w ベース深度の計算を実行する。したがって、アプリケーションで Direct3D トランスフォーム パイプラインを使用しない場合であっても、希望の w ベース機能を取得するために適切な射影行列を設定しておく必要がある。
Direct3D は射影行列の第 4 列を調べ、要素が [0,0,0,1] (アフィン射影) の場合には、システムは z ベースの深度値をフォグに使用する。この場合、デバイス空間の線形フォグ エフェクトの開始距離および終了距離を指定する必要もある。この範囲は、ユーザーに最も近い点を 0.0 とし、最も遠い点を 1.0 とした範囲である。
深度バッファ内での z 値の不均等なばらつきによって生じる、フォグの不自然なグラフィックス効果を抑えるために、ほとんどのハードウェア デバイスでは、ピクセル フォグに z ベース深度値ではなく視点からの相対深度を使用する。視点からの相対深度とは、本質的には同次座標セットからの w 要素である (Direct3D は、デバイス空間座標から RHW 要素の逆数を取得して真の w を再生成する)。デバイスが視点からの相対フォグをサポートしている場合、Direct3DDevice7.GetCaps メソッドを呼び出すと、そのデバイスは D3DPRIMCAPS 型の lRasterCaps メンバに D3DPRASTERCAPS_WFOG フラグを設定する (GetCaps に渡す D3DDEVICEDESC7 型には、各種プリミティブの能力を記述する複数の D3DPRIMCAPS 型が含まれている)。
注 : リファレンス ラスタライザを除き、ソフトウェア デバイスは常に z を使用してピクセル フォグ エフェクトを計算する。
視点からの相対フォグがサポートされている場合、設定された射影行列でデバイス空間の w 値に対応する、ワールド空間の z 値を生成するとき、システムは z ベース深度よりも視点からの相対深度を優先して自動的に使用する (射影行列を設定するには、Direct3DDevice7.SetTransform メソッドを呼び出し、CONST_D3DTRANSFORMSTATETYPE からD3DTRANSFORMSTATE_PROJECTION 値を使用し、希望の行列を表す D3DMATRIX 型を渡す)。射影行列がこの要件に対応していない場合は、フォグ エフェクトが正しく適用されない。適切な行列の生成の詳細については、「W バッファに有効な射影行列」を参照すること (「射影トランスフォームとは」で説明するパースペクティブ射影行列は、適切な射影行列を生成する)。
使用上の注意 : Direct3D では、現在設定されている射影行列を使用して w ベース深度の計算を実行する。したがって、アプリケーションで Direct3D トランスフォーム パイプラインを使用しない場合であっても、希望の w ベース機能を取得するために適切な射影行列を設定しておく必要がある。
Direct3D は射影行列の第 4 列を調べ、要素が [0,0,0,1] (アフィン射影) の場合には、システムは z ベースの深度値をフォグに使用する。この場合、デバイス空間の線形フォグ エフェクトの開始距離および終了距離を指定する必要もある。この範囲は、ユーザーに最も近い点を 0.0 とし、最も遠い点を 1.0 とした範囲である。