我将 pcf 代码添加到着色器中的 frank luna 3D 编程示例代码。
但是当网格没有设置法线贴图时。呈现的扇形图案。
这里有任何解决方案吗?
vLightProj.xyz /= vLightProj.w;
float percentLit = 0.0f;
float2 vDepthMapUV = float2((vLightProj.x / 2.f) + 0.5f, -(vLightProj.y / 2.f) + 0.5f);
// Texel size.
const float dx = SMAP_DX;
const float2 offsets[9] =
{
float2(-dx, -dx), float2(0.0f, -dx), float2(dx, -dx),
float2(-dx, 0.0f), float2(0.0f, 0.0f), float2(dx, 0.0f),
float2(-dx, +dx), float2(0.0f, +dx), float2(dx, +dx)
};
[unroll]
for (int i = 0; i < 9; ++i)
{
percentLit += DepthMap.SampleCmpLevelZero(g_sam_3,
vDepthMapUV.xy + offsets[i], vLightProj.z).r;
}
//그림자에 가려진 정도
percentLit /= 9.f;
float SpecCoef = g_tex_2.Sample(g_sam_1, vUV).x;
float4 vSpec = decode(SpecCoef);
output.vDiffuse = lightcolor.vDiff * percentLit + lightcolor.vAmb;