距離フォグ★ 1.はじめに
距離フォグもやってみました。
★ 2.距離フォグ
通常のフォグの場合は,カメラからある平面までの距離を使ってフォグをかけるために,フォグの濃度が同じところが直線的にならぶようになります。
![]() 通常のフォグの場合は,上図のように平行に濃度が分布するので,正面を向いた場合はきちんとしてフォグがかかりますが,横目でみるとフォグがかからないような状況が起こり,不自然に見えてしまいます。しかし,距離フォグはカメラからの距離によってフォグをかけるので,見る向きには影響を受けない利点があります。 実装自体は,そんなに難しくなく,深度値を用いてフォグを線形合成していたところを,カメラからの距離を算出して,線形合成するように変更するだけです。頂点シェーダ側で距離を算出して,フォグ係数を決定し,ピクセルシェーダの方は通常のフォグと同じように線形合成するだけです。 実際には下のようなコードになります。
00066: //-------------------------------------------------------------------------------------------------
00067: // Name : VertexShaderFunction()
00068: // Desc : 頂点シェーダ
00069: //-------------------------------------------------------------------------------------------------
00070: VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
00071: {
00072: VertexShaderOutput output = (VertexShaderOutput)0;
00073:
00074: float4 worldPosition = mul(input.Position, World);
00075: float4 viewPosition = mul(worldPosition, View);
00076: output.Position = mul(viewPosition, Projection);
00077:
00078: // TODO: add your vertex shader code here.
00079: output.Texcoord = input.Texcoord;
00080: output.Normal = input.Normal;
00081: output.ObjPosition = input.Position;
00082:
00083: // 距離算出
00084: float dist = length( input.Position - CameraPosition );
00085:
00086: // フォグ係数算出
00087: output.Fog = FogCoord.x + dist * FogCoord.y;
00088:
00089: return output;
00090: }
00091:
★ Download
本ソースコードおよびプログラムを使用したことによる如何なる損害も製作者は責任を負いません。
本ソースコードおよびプログラムは自己責任でご使用ください。 プログラムの作成にはMicrosoft Visual Studio 2008 SP1 Professional, XNA Game Studio 3.0を用いています。 |