2013-03-14 48 views
2

我掙扎了一段時間,在我的xna遊戲中添加了一個fog效果。 我在文件(.Fx)中使用自定義着色器效果。 「PixelShaderFunction」的工作原理沒有錯誤。但問題是我所有的土地都以同樣的方式着色。 我認爲問題來自相機與型號之間距離的計算。如何計算xna上霧效應模型的距離?

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); 
} 

回答

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; 

在你的Vertex Shader填充Position3D與頂點的位置乘上世界矩陣:

output.Position3D = mul(input.pos, matWorld); 
+0

非常感謝!你的例子非常適合我的問題。 – 2013-04-02 06:54:22