2

xnaゲームにフォグ効果を追加するのにしばらく苦労しました。ファイル(.Fx)でカスタムシェーダーエフェクトを使用しています。「PixelShaderFunction」はエラーなしで動作します。しかし、問題は、私の土地がすべて同じように着色されていることです。問題は、カメラとモデルの間の距離の計算にあると思います。

float distance = length(input.TextureCoordinate - cameraPos);

これが「PixelShaderFunction」を使った私の完全なコードです

// Both techniques share this same pixel shader.
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
      float distance = length(input.TextureCoordinate - cameraPos);
      float l = saturate((distance-fogNear)/(fogFar-fogNear));
      return tex2D(Sampler, input.TextureCoordinate) * lerp(input.Color, fogColor, l);
}
4

1 に答える 1

0

input.TextureCoordinateが実際にサンプラーのテクスチャ座標を表している場合、距離を計算しようとする方法は間違っています。

PixelShaderFunctionの本体は次のように変更できます。

float distance = distance(cameraPos, input.Position3D);
float l = saturate((distance-fogNear)/(fogFar-fogNear));
return lerp(tex2D(Sampler, input.TextureCoordinate), fogColor, l);

VertexShaderOutput宣言に以下を追加します。

float4 Position3D : TEXCOORD1;

頂点シェーダーで、Position3Dにワールドマトリックスで乗算された頂点の位置を入力します。

output.Position3D = mul(input.pos, matWorld);
于 2013-03-31T20:26:49.850 に答える