Я написал простое тестовое приложение OpenGL о базовой технике теневого отображения.Основные артефакты картирования теней с использованием OpenGL и GLSL
Я удалил большинство артефактов, за исключением одного на задней поверхности окклюдера. Это заднее лицо связано с артефактами, потому что во время первого прохождения рендеринга (заполнение карты глубины теней) я разрешаю отбрасывание передней поверхности. Следовательно, у меня есть затененные z-боевые артефакты.
Чтобы решить эту проблему, на нескольких уроках он сказал, что глубина положения вершин в светлом пространстве должна быть смещена с очень небольшим смещением, например, 0,0005f.
Вот скриншот моей проблемы (для видимости я увеличил значение окружающего света для коробки). Здесь без глубины смещения:
Как вы можете видеть, что есть сильная самозатенения.
Вот кусок кода, который я использую в моем пиксельный шейдер:
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;
Скриншот:
Как вы видите, самозатенение является декретом Ased. Теперь давайте попробуем со смещением равным 0.0003f:
tmp_shadow_coords.z -= 0.0003f;
The Screeshot:
Как вы можете видеть себя shadowinh исчезла! Но если я приближаюсь к пределу между окклюдером и тенью, мы можем видеть незаштрихованную область. Этот артефакт называется артефактом Петра Паннинга.
Итак, это странная ситуация: во избежание самозатенения артефакт мне нужно изменить значение глубины вершин в пространстве света. Но эта модификация поездов глубины вызывает артефакт Питера Панинга!
Проблема хуже, если я увеличиваю значение смещения.
ОБНОВЛЕНИЕ
Я также попытался добавить смещение. Например:
tmp_shadow_coords.z += 0.0002f;
Скриншот:
Там меньше себя не затенения, но не Питер Panning артефакт. Но, к сожалению, на передних гранях куба появляются некоторые артефакты. На лицевых поверхностях происходит переполнение тени.
Если я увеличиваю смещение:
tmp_shadow_coords.z += 0.0003f;
Скриншот:
В самозатенении артефактов полностью исчез, но перелив тень впереди сталкивается хуже.
Так что, интересно, можно ли сделать рендер без самозатенения и артефакта Peter Panning?
Вы можете отключить повторение фронтальной поверхности, зафиксировать частичную собственную тень (вся задняя сторона будет в темноте) и peter-pan –
Во время первого прохода я разрешаю отбрасывание фронтальной поверхности с помощью вызовов glEnable (GL_CULL_FACE); glCullFace (GL_FRONT); ... заполнение теневого отображения ... и в конце (перед вторым проходом) я вызываю glDisable (GL_CULL_FACE); для отключения отбраковки лица. Где я могу снова отключить отбрасывание лицевой поверхности? Я не понимаю, извините. – user1364743
Я обновил сообщение. Я уже пытался это сделать, но на этот раз на передних гранях куба появляются другие артефакты (например, переполнение). Смотрите мое обновление, пожалуйста. – user1364743