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 回答