我想复制BasicEffect的雾方法以在我自己的着色器中使用,所以我不必声明一个basiceffect着色器和我自己的着色器。基本效果的HLSL代码与XNA Creators Club上的一个可下载样本一起发布了,我认为所需的方法可以在该HLSL文件中找到。但是,我所能看到的只是一个被调用的函数,但没有该函数的实际定义。调用的函数是:
ApplyFog(color, pin.PositionWS.w);
是否有人知道定义的位置以及是否可以自由接受。否则任何有关如何复制它效果的帮助都会很棒。
我从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;
是吗?相机剪辑远传递为常量。
答案 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选择一个较小的值来获得更平滑的雾。