Я пытался понять, как работает ESM - у меня обычное Shadow Mapping in Place (скрытое / не закрытое) в конвейере отложенного рендеринга, и я вместо этого пытаюсь использовать ESM.
Я пытался адаптировать это из Cansin:
http://homepage.lnu.se/staff/tblma/Deferred Rendering в XNA 4.pdf
Но так как он не использует направленный свет, у меня может быть недопонимание. В основном это мой подход к адаптации к направленным источникам света:
Создать ShadowMap :
float4 PS(VSO input) : COLOR0
{
float depth = input.Position2D.z / input.Position2D.w;
return exp(depth);
}
Я использую матрицу ортогональной проекции (та же самая NearFarClip, что и у реальной камеры), как и в случае обычного Shadow Mapping (Position2D - это ScreenSpace, потому что это направленный источник света, Z - это всегда расстояние поверхность / источник света, или я ошибаюсь? )
Get Shadow Factor - в основном, как обычный Shadow Mapping, я превращаюсь в Light / Screenspace, получая глубину из 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);
Мое мышление в корне неверно?