2014-10-16 3 views
2

Я написал простое тестовое приложение OpenGL о базовой технике теневого отображения.Основные артефакты картирования теней с использованием OpenGL и GLSL

Я удалил большинство артефактов, за исключением одного на задней поверхности окклюдера. Это заднее лицо связано с артефактами, потому что во время первого прохождения рендеринга (заполнение карты глубины теней) я разрешаю отбрасывание передней поверхности. Следовательно, у меня есть затененные z-боевые артефакты.

Чтобы решить эту проблему, на нескольких уроках он сказал, что глубина положения вершин в светлом пространстве должна быть смещена с очень небольшим смещением, например, 0,0005f.

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

enter image description here

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

Вот кусок кода, который я использую в моем пиксельный шейдер:

if (ShadowCoords.w > 0.0f) 
{ 
    vec4 tmp_shadow_coords = ShadowCoords; 

    tmp_shadow_coords.z -= 0.0000f; //DEPTH OFFSET DISABLE HERE 
    shadowFactor = textureProj(ShadowMap, tmp_shadow_coords); 
} 

Теперь давайте посмотрим, что происходит при использовании смещения равно 0.0002f:

tmp_shadow_coords.z -= 0.0002f; 

Скриншот:

enter image description here

Как вы видите, самозатенение является декретом Ased. Теперь давайте попробуем со смещением равным 0.0003f:

tmp_shadow_coords.z -= 0.0003f; 

The Screeshot:

enter image description here

Как вы можете видеть себя shadowinh исчезла! Но если я приближаюсь к пределу между окклюдером и тенью, мы можем видеть незаштрихованную область. Этот артефакт называется артефактом Петра Паннинга.

Итак, это странная ситуация: во избежание самозатенения артефакт мне нужно изменить значение глубины вершин в пространстве света. Но эта модификация поездов глубины вызывает артефакт Питера Панинга!

enter image description here

Проблема хуже, если я увеличиваю значение смещения.

ОБНОВЛЕНИЕ

Я также попытался добавить смещение. Например:

tmp_shadow_coords.z += 0.0002f; 

Скриншот:

enter image description here

Там меньше себя не затенения, но не Питер Panning артефакт. Но, к сожалению, на передних гранях куба появляются некоторые артефакты. На лицевых поверхностях происходит переполнение тени.

Если я увеличиваю смещение:

tmp_shadow_coords.z += 0.0003f; 

Скриншот:

enter image description here

В самозатенении артефактов полностью исчез, но перелив тень впереди сталкивается хуже.

Так что, интересно, можно ли сделать рендер без самозатенения и артефакта Peter Panning?

+0

Вы можете отключить повторение фронтальной поверхности, зафиксировать частичную собственную тень (вся задняя сторона будет в темноте) и peter-pan –

+0

Во время первого прохода я разрешаю отбрасывание фронтальной поверхности с помощью вызовов glEnable (GL_CULL_FACE); glCullFace (GL_FRONT); ... заполнение теневого отображения ... и в конце (перед вторым проходом) я вызываю glDisable (GL_CULL_FACE); для отключения отбраковки лица. Где я могу снова отключить отбрасывание лицевой поверхности? Я не понимаю, извините. – user1364743

+0

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

ответ

2

enter image description here

Это работает очень хорошо. Существует небольшой зазор, где отливающая поверхность находится очень близко к поверхности приема.

Главное, чтобы получить право в шейдере, как применяется тень. Масштабируйте только добавленные прямые световые, диффузные и зеркальные термины по значению тени/окклюзии (окружающие условия должны быть оставлены в покое). Легкая проверка заключается в том, что поверхности в тени должны выглядеть точно так же, как поверхности, обращенные в сторону от света с отключенным затенением. Тени не должны просто делать вещи темнее (т. Е. finalColour *= 1.0-shadowScale или finalColour -= shadow), вместо этого они представляют собой отсутствие прямого света. Это становится очень важным, когда задействовано несколько источников света.

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