Маска полутени

Разрабатываю свой движок #ForceEngine на базе ресурсов игр #Thief и #SystemShock2 .
Маска полутени (penumbra mask) - прием оптимизации, который позволил обрабатывать в риалтайме динамические мягкие тени от всех объектов и от каждого источника света на уровне.

"Острые" края теней приобретают "мягкость" за счет дополнительных выборок (сэмплирования) из карты теней (shadow map), но это очень ресурсозатратная операция. Поэтому, чтобы сэкономить и не сэмплировать места, где точно не может быть полутеней, создается маска полутени. Закрашенные зеленым фрагменты на видео - это и есть эта маска. Именно здесь карта теней сэмплируется дополнительными выборками.

Шаги построения маски:

Для каждого источника строится буфер глубины, по нему определяются грани видимой источником геометрии. Эта информация записывается в тот же фреймбуфер и имеет такое же разрешение, что и тени. А затем для неё строится цепочка мип-уровней. Таким образом, если мы будем сэмплировать из более низких уровней, получим оптимальное покрытие в тех местах, где тень должна размываться - на границах.

Подписывайтесь, чтобы не пропускать новости проекта!

71
32 комментария

А можно подробней расписать процесс, происходящий между шагами? Какое разрешение имеет получившаяся маска? Почему стенка за источником света полностью покрыта маской?

2
Ответить

Дополнил статью под скриншотами 😉

2
Ответить

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

2
Ответить

Комментарий недоступен

2
Ответить

Название для Force Engine придумал даже не я, а мой друг, просто подставив мой ник в название - Force. А я подумал, а почему нет?
Вроде бы последний дум делает нечто подобное со статической частью шэдоумап. Так что, ты предвосхитил эту технологию 😉.
Расскажешь о своём движке?

1
Ответить

Прошу простить, а движок будет в открытом доступе? Его можно купить, скачать бесплатно? Уж очень мне нравится ваша работа. И удачи вам!

1
Ответить

Спасибо! ;) Да, я склоняюсь к полуоткрытому распространению, по типу Юнити. Пока, к сожалению, API не готово, поэтому опубликован он будет не в ближайшее время. Но это в планах.

4
Ответить