我试图了解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);
我的想法从根本上错了吗?