Как понять Exponential Shadow Mapping в HLSL с направленным светом? - PullRequest
1 голос
/ 23 марта 2019

Я пытался понять, как работает 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);

Мое мышление в корне неверно?

...