Обработка проективного алиасинга в Shadow Mapping

15

Я возлюсь с простым процедурным 3D-моделированием, чтобы сделать маленькие здания для 3D-печати. Пример:

Здание


Чтобы сделать модели более читабельными на экране, я реализовал базовое отображение теней для одного направленного света. Поскольку моя сцена не меняется, я просто визуализирую карту теней один раз с помощью выровненного по оси блока сцены, чтобы выяснить, какими должны быть границы карты теней. Тени и границы выглядят так, как будто у меня все матрицы правильные, но подход немного ближе выглядит ужасно:

Башня крупным планом

Из прочитанного мною чтения я понимаю панорамирование Питера и то, что я могу с этим сделать, но неровные края, которые, как я считаю, являются формой проективного алиасинга, выглядят настолько плохо, что я думаю, что что-то не так в моей базовой реализации.

Я взломал пиксельный шейдер, чтобы показать границы теневого текселя:

Отображение границ Texel

У меня есть билинейная фильтрация в текстуре (без нее я получаю серьезные теневые прыщи). К сожалению, моя попытка PCF тоже не удалась - она ​​выглядит так же рваной:

введите описание изображения здесь

Вот один пример с отключенной билинейной фильтрацией:

введите описание изображения здесь

Похоже ли это на «типичное» проективное алиасинг? Может ли динамический рендеринг карты теней с использованием усеченного вида, привязанного к сцене, возможно с каскадом, решить проблему?

Изменить: добавление крупным планом билинейной фильтрации, сравнение теней, просто чтобы показать, что я получаю. Плохие тени прыщей появляются из-за внутренних краев; Я моделирую со сложенными виртуальными блоками и не выполняю правильную операцию объединения. Из моего прочтения реализация логических операций на многогранниках не тривиальна, но также позволит мне реализовать статические теневые объемы, а также очистить некоторые программы для 3D-печати.

Билинейная фильтрация

Даниэль М Гессель
источник

Ответы:

10

Картографирование теней с приемлемым качеством - настоящее путешествие. Итак, вы реализовали первый шаг - базовую карту теней, которая статически охватывает всю сцену. Это означает, что размер текселя карты теней в пространстве светлого обзора к размеру тексера визуализированной сцены в отношении пространства обзора камеры довольно велик, что приводит к наложению псевдонимов. Чтобы уменьшить это соотношение ближе к 1: 1, вы упомянули следующие методы:

  • Самый простой способ - увеличить размер вашей карты теней, чтобы найти значение с оптимальной производительностью,
  • выровняйте карту теней с усечением камеры. Затем карта теней охватывает меньшую часть сцены, поэтому она уменьшает наложение,
  • это может быть улучшено до CSM, который делает то же самое, но вам нужно визуализировать сцену для каждого из каскадов с разным центральным положением матрицы светового обзора на основе центральной точки каждого среза усеченного конуса.

Некоторые из основных приемов сглаживания края тени:

  • очевидно, PCF, но рекомендуется сочетать реализацию PCF со встроенным аппаратным PCF (в Opengl - с использованием sampler2DShadow). Это приведет к меньшему количеству итераций цикла с вашей стороны и более дешевому PCF,
  • блочность краев можно заменить шумом с помощью вращающегося диска Пуассона. Образцы, используемые для выборки из карты теней, вращаются случайным образом при каждой итерации цикла PCF.

Вы также можете изучить методы сглаживания краев, такие как:

  • рендеринг карты теней в прикладной кадровый буфер MSAA,
  • дальнейшее усиление ПКФ путем интерполяции ,
  • увеличение количества образцов с временной смесью .

Основная техника PCF страдает от прыщей в тени, которые можно исправить, применяя некоторое смещение в тесте тени. Расчет размера этого смещения также является областью исследований .

Другие более продвинутые методы карты теней включают в себя:

  • Показательные Shadow Maps и Разница теневые карты - в большинстве случаев не страдают от акне тени и предлагают гладкие края без квадратиков, но стоимость некоторых легких протекших ситуаций,
  • Exponential Variance Shadow Maps - вероятно, самый продвинутый метод отображения теней 2D карты глубины, сочетающий в себе большую плавность VSM и устранение утечек света, что удваивает стоимость использования памяти,
  • Percentage Closer Soft Shadows - базовая техника улучшения традиционных карт теней с изменяющимся размером полутени,
  • Multiview Shadow Maps - множественные карты теней некоторой техники, расположенные на свету области, для вычисления реалистичных мягких теней с переменным размером полутени,
  • Deep Shadow Maps - для увеличения объемного рассеяния с тенями,
  • Тени в реальном времени прослеживаются в тенях - вероятно, в будущем.

Вы не ошиблись с PCF, это выглядит так :)

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

притвор
источник
Часть этого комментария благодарит вас за ваш ответ, поэтому я просто подумал, что дам вам знать, так как вы не получите уведомление оттуда.
Трихоплакс
Да, я видел это, но спасибо.
Narthex
1

Вы сказали, что "... билинейная фильтрация в текстуре ...". Кажется, вы интерполируете значения глубины карты теней. Правильный способ использования интерполяции с картой теней - применить ее к результатам тестов теней (насколько я помню, OpenGL поддерживает это). Вы можете даже объединить интерполяцию результатов теневых тестов с PCF, что даст гораздо лучшие результаты. Однако, как вы могли заметить, псевдонимы - это чума, которая всегда преследует карты теней :)

Хотя я понимаю, что вы ищете решения, касающиеся теневого отображения (даже потому, что оно довольно просто реализовать), вы когда-нибудь задумывались об использовании теневых объемов? Его гораздо сложнее реализовать, но он не страдает от наложения алиасов вообще, и я думаю, что он будет соответствовать вашим целям.

Кристиан Пагот
источник
Большое спасибо за ответы! Чтобы получить результаты, которые я ищу, было бы целесообразно переключиться на теневые объемы. Ссылка на кодовый поток в разделе «интерполяция» очень полезна - спасибо!
Даниэль М Гессель