Platform SDK: DirectX |
Direct3D では、Direct3D のトランスフォーム & ライティング エンジンで頂点フォグを使用する場合にのみ、範囲ベースのフォグの計算を実行する。これは、ピクセル フォグはデバイス ドライバに実装され、現在のところ、ピクセル単位の範囲ベースのフォグをサポートするハードウェアは存在しないためである。アプリケーションで独自のトランスフォーム & ライティングを実行する場合は、範囲ベースの計算かその他の計算による独自のフォグ計算を行う必要がある。
フォグを使用すると、オブジェクトがフォグ カラーと直感的でない方法でブレンドされるために生じる不自然なグラフィックス効果が見えることがある。たとえば、2 つのオブジェクトが見えていて、一方はフォグの影響を受けるくらいに遠くにあり、他方は影響されないくらいに近くにあるというシーンを想定する。表示領域が同じ場所で回転した場合、オブジェクトが静止していたとしても、現れるフォグ エフェクトは変化することがある。次の図はこうした状況を見下ろしたステートを示す。
範囲ベースのフォグは、フォグ エフェクトをより正確に決定する方法である。範囲ベースのフォグでは、Direct3D は視点から頂点までの実際の距離をフォグの計算に使用して、シーンの範囲内での頂点の深度ではなく 2 点間の距離の増加に従ってフォグのエフェクトを増加するため、不自然な回転効果が回避される。
現在のデバイスが範囲ベースのフォグをサポートしている場合、IDirect3DDevice7::GetCaps メソッドを呼び出したときに、デバイスは D3DPRIMCAPS 構造体の dwRasterCaps メンバに D3DPRASTERCAPS_FOGRANGE 能力フラグを設定する。範囲ベースのフォグを有効にするには、D3DRENDERSTATE_RANGEFOGENABLE レンダリング ステートを TRUE に設定する。
現在のデバイスが範囲ベースのフォグをサポートしている場合、Direct3DDevice7.GetCaps メソッドを呼び出すと、デバイスは D3DPRIMCAPS 型の lRasterCaps メンバに D3DPRASTERCAPS_FOGRANGE 能力フラグを設定する。範囲ベースのフォグを有効にするには、D3DRENDERSTATE_RANGEFOGENABLE レンダリング ステートを TRUE に設定する。
範囲ベースのフォグは、Direct3D により、トランスフォーム & ライティングの間に計算される。「頂点フォグについて」で説明したように、Direct3D トランスフォーム & ライティング エンジンを使用しないアプリケーションは、独自に頂点フォグの計算も行わなければならない。この場合、範囲ベースのフォグ係数を、各頂点のスペキュラ成分のアルファ成分に設定する。