Хотя каскадные карты теней, выровненные по всему миру, хороши и используются в большинстве новых игр, это не связано с тем, почему ваши тени имеют странное смещение с текущей реализацией.
На самом деле, похоже, что вы 'повторяйте выборку из правильных текселей на карте теней только там, где встречающиеся тени находятся именно там, где вы ожидаете их увидеть, однако ваше сравнение отключено.
Я добавил несколько комментариев к вашему коду:
vec3 ProjCoords = LightSpacePos.xyz / LightSpacePos.w; // So far so good...
vec2 UVCoords;
UVCoords.x = 0.5 * ProjCoords.x + 0.5; // Right, you're converting X and Y from clip
UVCoords.y = 0.5 * ProjCoords.y + 0.5; // space to texel space...
float Depth = texture(ShadowSampler, UVCoords).x; // I expect we sample a value in [0,1]
if (Depth < (ProjCoords.z + 0.0001)) // Uhoh, we never converted Z's clip space to [0,1]
return 0.5;
else
return 1.0;
Итак, я подозреваю, что вы хотите сравнить с ProjCoords.z * 0.5 + 0.5
:
if (Depth < (ProjCoords.z * 0.5 + 0.5 + 0.0001))
return 0.5;
else
return 1.0;
Кроме того, этот фактор смещения заставляет меня нервничать.А еще лучше, просто возьмите это сейчас и разберитесь с этим, как только тени появятся в правильных местах:
const float bias = 0.0;
if (Depth < (ProjCoords.z * 0.5 + 0.5 + bias))
return 0.5;
else
return 1.0;
Возможно, я не совсем прав насчет того, как преобразовать ProjCoords.z, чтобы он соответствовал выборкезначение, однако это, вероятно, проблема.Кроме того, если вы переходите к каскадным картам теней (я рекомендую выравнивать по миру), я настоятельно рекомендую рисовать узоры, представляющие, где просматривается каждая карта теней - это значительно упрощает отладку.