Xna 基本效果雾,使用的代码

Xna 基本效果雾,使用的代码,xna,effects,hlsl,Xna,Effects,Hlsl,我想复制BasicFect的fog方法以在我自己的着色器中使用,这样我就不必声明BasicFect着色器和我自己的着色器。基本效果的HLSL代码与XNA Creators Club上的一个可下载示例一起发布,我认为所需的方法可以在该HLSL文件中找到。然而,我所能看到的只是一个被调用的函数,但没有该函数的实际定义。调用的函数是: ApplyFog(color, pin.PositionWS.w); 有人知道这个定义在哪里,是否可以自由接受吗。否则,任何关于如何复制其效果的帮助都将是巨大的 我从

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

ApplyFog(color, pin.PositionWS.w);
有人知道这个定义在哪里,是否可以自由接受吗。否则,任何关于如何复制其效果的帮助都将是巨大的

我从网站下载了样本

谢谢

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

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;

是这样吗?相机剪辑far作为常量传入。

以下是如何实现类似效果的示例

在顶点着色器函数中,通过viewspace Z位置除以远平面的距离,这为深度值提供了一个很好的0..1贴图

然后,在pixelshader中,使用lerp函数在原始颜色值和fogcolor之间混合,下面是一些伪代码:

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));
}
这是我从头开始写的,希望能有所帮助。
我选择的常数会给你一个非常陡峭的雾,选择一个较小的雾值以获得更平滑的雾。

你能发布一张效果的图片吗?BasicFect的雾是什么意思?是的,或者任何能说明你想要达到的效果的东西,我不熟悉BasicFect的雾。好了。那太好了。我试过我自己的版本,但它似乎只是把整个场景涂成白色…看起来好像它只是淡入背景或雾中?颜色你能粘贴到目前为止的代码吗?好的,在尝试用我现有的着色器代码实现这一点之后,我似乎仍然有问题。从本质上说,一切似乎都在描绘雾的颜色。我想远平面应该是相机的远剪裁平面?不,我还没解出来。所有的颜色看起来都一样,我想这是一个获取深度的问题。我在上面发布了我的代码,你能看出有什么不对吗?你没有存储视图空间深度,你使用的是世界空间位置的z值,这当然不起作用。使用通过将世界空间位置与世界和视图矩阵相乘获得的位置。