Xna 如何理解具有平行光的HLSL中的指数阴影映射?

Xna 如何理解具有平行光的HLSL中的指数阴影映射?,xna,monogame,hlsl,Xna,Monogame,Hlsl,我试图了解ESM是如何工作的——我在延迟渲染管道中有常规阴影贴图(遮挡/不遮挡),并尝试使用ESM 我试着从Cansin改编这个: 但由于他不使用方向灯,我可能会产生误解。这基本上是我将其调整为平行光的方法: 创建阴影贴图: 我使用的是正交投影矩阵(与实际cam相同的NearFarClip),就像我使用常规阴影贴图一样(Position2D是屏幕空间,因为它是平行光,Z始终是距离曲面/光,还是我错了?) 获取阴影因子-基本上与常规阴影贴图类似,我将其转换为灯光/屏幕空间,从阴影贴图获取深度 f

我试图了解ESM是如何工作的——我在延迟渲染管道中有常规阴影贴图(遮挡/不遮挡),并尝试使用ESM

我试着从Cansin改编这个:

但由于他不使用方向灯,我可能会产生误解。这基本上是我将其调整为平行光的方法:

创建阴影贴图:

我使用的是正交投影矩阵(与实际cam相同的NearFarClip),就像我使用常规阴影贴图一样(Position2D是屏幕空间,因为它是平行光,Z始终是距离曲面/光,还是我错了?)

获取阴影因子-基本上与常规阴影贴图类似,我将其转换为灯光/屏幕空间,从阴影贴图获取深度

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);
我的想法根本错误吗

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);