1

我想复制 BasicEffect 的雾方法以在我自己的着色器中使用,因此我不必声明一个基本效果着色器和我自己的。基本效果的 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;

那正确吗?Camera clip far 作为常量传入。

4

1 回答 1

0

这是一个如何实现类似效果的示例

在您的顶点着色器函数中,您传递视图空间 Z 位置,除以远平面的距离,这为您的深度值提供了一个很好的 0..1 映射。

然后,在您的像素着色器中,您使用 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 选择一个较小的值以获得更平滑的雾。

于 2013-04-26T16:23:54.427 回答