BasicEffect雾,使用的代码

时间:2013-04-26 14:20:20

标签: xna effects hlsl

我想复制BasicEffect的雾方法以在我自己的着色器中使用,所以我不必声明一个basiceffect着色器和我自己的着色器。基本效果的HLSL代码与XNA Creators Club上的一个可下载样本一起发布了,我认为所需的方法可以在该HLSL文件中找到。但是,我所能看到的只是一个被调用的函数,但没有该函数的实际定义。调用的函数是:

ApplyFog(color, pin.PositionWS.w);

是否有人知道定义的位置以及是否可以自由接受。否则任何有关如何复制它效果的帮助都会很棒。

我从here下载了示例。

enter image description here

感谢。

编辑:Stil有问题。认为这与获得深度有关:

VertexToPixel InstancedCelShadeVSNmVc(VSInputNmVc VSInput, in VSInstanceVc VSInstance)
{   
    VertexToPixel Output = (VertexToPixel)0;
    Output.Position = mul(mul(mul(mul(VSInput.Position, transpose(VSInstance.World)), xWorld), xView), xProjection);
    Output.ViewSpaceZ = -VSInput.Position.z / xCameraClipFar;

是吗?相机剪辑远传递为常量。

1 个答案:

答案 0 :(得分:0)

下面是一个如何实现类似效果的例子

在“顶点着色器”功能中,传递视图空间Z位置除以远程平面的距离,为深度值提供一个漂亮的0..1映射。

在你的pixelhader中,你使用lerp函数在原始颜色值和雾色之间进行混合,这是一些(伪)代码:

cbuffer Input //Im used to DX10+ remove the cbuffer for DX9
{
    float FarPlane;
    float4 FogColor;
}

struct VS_Output
{
    //...Whatever else you need
    float ViewSpaceZ : TEXCOORD0; //or whatever semantic you'd like to use
}


VS_Output VertexShader(/*Your Input Here */)
{
    VS_Output output;
    //...Transform to viewspace
    VS_Output.ViewSpaceZ = -vsPosition.Z / FarPlane;

    return output;
}

float4 PixelShader(VS_Output input) : SV_Target0 // or COLOR0 depending on DX version
{
    const float FOG_MIN = 0.9;
    const float FOG_MAX = 0.99;
    //...Calculate Color
    return lerp(yourCalculatedColor, FogColor, lerp(FOG_MIN, FOG_MAX, input.ViewSpaceZ));
}

我从头脑中写下这个,希望它有所帮助。 我选择的常数会给你一个非常“陡峭”的雾,为FOG_MIN选择一个较小的值来获得更平滑的雾。