Я играл с теневым отображением в OpenGL, используя текстуры глубины. Глубина текстуры хорошая, и я могу нанести ее на сцену, но у меня есть странные артефакты на задней стороне объекта:
У меня вопрос, что является причиной этого и как я могу это исправить?
Фрагментный шейдер, который я использую, довольно прост (для простоты я убрал цвет, если вам интересно, почему здесь нет синего цвета):
in vec4 vShadowCoord;
uniform sampler2DShadow shadowMap;
out vec4 fragColor;
void main()
{
float bias = 0.005;
float visibility = 1.0;
if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
visibility = 0.25;
fragColor = vec4(visibility);
}
Изменить: По запросу минимальный рабочий пример скриншота, который использует только приведенный выше код (без цвета).
opengl
glsl
shadow-mapping
shadow
Blarglenarf
источник
источник
Ответы:
Эта проблема выглядит как стандартные артефакты прыщей карты теней. Кроме того, ваше уравнение освещения является неполным или неправильным. Свет не должен влиять на лица с нормалью, направленной от него. Это также означает, что при правильном уравнении «темная» сторона сферы не должна иметь никаких артефактов от прыщей.
Есть три источника артефактов прыщей:
Подводя итог, достаточно узкого усеченного конуса с несколькими каскадами и некоторой подстройкой смещения, чтобы заставить работать общий случай (направленный свет). Начните настройку, отключив теневую фильтрацию, и настройте фильтрацию только тогда, когда базовые карты теней достаточно надежны.
Кроме того, помимо постоянного смещения глубины (которое вы используете в настоящее время), вы также должны добавить смещение глубины наклона и максимальное смещение глубины наклона. Оба могут быть реализованы либо как состояние рендеринга, либо как код шейдера во время рендеринга карты теней. Смещение глубины наклона - это просто магическое значение смещения, масштабированное точкой (нормальное, lightDir).
Есть несколько дополнительных интересных методов, и большинство из них реализованы в отличной демоверсии: Matt Pettineo - «Выборка теневых техник» .
источник