2015-06-27 2 views
0

В настоящее время я работаю над реализацией теневого отображения для своего game engine, кажется, что это рендеринг и отличная теневая карта, но если тень слишком близко от излучателя, кажется, она срезана , как показано на этом скриншоте: Screenshot
(белые линии там, чтобы проверить, находится ли тень в нужном месте, они проецируются от источника пятна света к вершинам куба).Моя тень правильная, но разрезанная

Как вы можете видеть, тень вырезана, так как она должна начинаться с края куба на полу.

Я использую 256 * 256 depth16 карту теней вынесенную с легкой точки зрения с перспективной матрицей: NzMatrix4f::Perspective(lightComponent.GetOuterAngle()*2.f, 1.f, 2.f, lightComponent.GetRadius())

что в конечном итоге дает нам следующую матрицу проекции:

1, 0, 0, 0, 
0, 1, 0, 0, 
0, 0, -1.02041, -1, 
0, 0, -2.04082, 0 

я нашел что уменьшение значения zFar было немного улучшив тень:

zNear = 0.1, zFar = 1000
zNear = 0.1, zFar = 500

Я думаю, что проблема исходит из теста, хотя я понятия не имею, что я делаю неправильно.

Вот код шейдера (при проецировании тени):

Vertex Shader:

vLightSpacePos = LightProjMatrix * LightViewMatrix * WorldMatrix * vec4(VertexPosition, 1.0); 

Фрагмент Shader:

#if SHADOW_MAPPING 
if (vLightSpacePos.w > 0.0) 
{ 
    vec3 ProjectionCoords = vLightSpacePos.xyz/vLightSpacePos.w; 

    vec2 UVCoords; 
    UVCoords.x = 0.5 * ProjectionCoords.x + 0.5; 
    UVCoords.y = 0.5 * ProjectionCoords.y + 0.5; 

    float Depth = texture(ShadowMap, UVCoords).x; 
    if (Depth < ProjectionCoords.z) 
    { 
     lightDiffuse *= 0.5; 
     lightSpecular = vec3(0.0); 
    } 
} 
#endif 

Вот видео, которое я сделал, чтобы показать ошибку, с прожектор, бросающий тень из куба (оба не двигаются), и где я делаю пол снизу, тень, кажется, исправляет себя, когда расстояние достаточно велико:

https://youtu.be/sisbOOml_cg

Я что-то упустил?

ответ

0

Я исправил свою проблему, это было вызвано смещением (оно должно применяться перед разделением перспективы, а не после).

Смежные вопросы