如何用定向光理解HLSL中的指数阴影映射?

时间:2019-03-23 16:54:51

标签: xna monogame hlsl

我试图了解ESM的工作原理-我在延迟渲染管道中设置了常规阴影映射(被遮挡/未遮挡),并尝试使用ESM。

我尝试改编自Cansin:
http://homepage.lnu.se/staff/tblma/Deferred Rendering in XNA 4.pdf

但是由于他不使用定向灯,所以我可能会有误解。基本上这是我将其适应定向光的方法:

创建ShadowMap

float4 PS(VSO input) : COLOR0
{
    float depth = input.Position2D.z / input.Position2D.w;
    return exp(depth);
}

我正在使用正交投影矩阵(与实际的cam相同,与NearFarClip相同),就像我对常规阴影贴图所做的那样(Position2D为ScreenSpace,因为它是定向光,Z始终是表面/光的距离,还是我错了吗? )

获取阴影因子-基本上就像常规的阴影映射一样,我转换为光照/屏幕空间,并从ShadowMap获取深度

float4 Position = 1;
Position.xy = input.ScreenPosition.xy;
Position.z = Depth; // saved depth from gbuffer
Position = mul(Position, InverseViewProjection);
Position /= Position.w;

float4 LightScreenPos = mul(Position, LightViewProjection);
LightScreenPos /= LightScreenPos.w;

float2 LUV = 0.5f * (float2(LightScreenPos.x, -LightScreenPos.y) + 1.0f);

float shadowDepth = tex2D(sampler_shadow, LUV).r;

float shadow = shadowDepth * exp(-10 * LightScreenPos.z);

我的想法从根本上错了吗?

0 个答案:

没有答案