Атмосферное рассеяние в фильме "Кузнец

Еще на этапе планирования The Blacksmith мы поняли, что нам нужно решение для рассеивания атмосферы, которое позволило бы нам получить немного больше деталей и контроля, чем встроенные опции тумана. В частности, мы хотели подчеркнуть эффект воздушной перспективы в некоторых более масштабных кадрах фильма.

Когда мы начали работать над решением проблемы рассеяния для проекта, мы сначала применили и поиграли с имитационными моделями, представленными в нескольких работах Томоюки Нишиты[1]. После некоторых экспериментов и создания прототипов различных кадров мы решили, что нам лучше остановиться на модели, позволяющей осуществлять широкий художественный контроль над каждым кадром в короткометражном фильме. Мы хотели получить решение, которое позволило бы нам приблизиться к основным элементам физических моделей, но при этом позволяло бы нарушать все правила, когда это необходимо. Нам также нужно было, чтобы решение не оказывало большого влияния на производительность короткометражного фильма, и мы поставили перед собой цель сделать большинство вычислений на вершину, а не на пиксель.
Мы поставили перед собой цель попытаться эмулировать комбинированные эффекты Рэлеевского и Ми-рассеяния в физических моделях. Мы также добавили третий элемент, представляющий различные типы эффектов рассеяния на малых высотах, которые получили общее название "рассеяние по высоте". Еще одним ключевым отличием от моделей, основанных на физике, стало то, что мы решили использовать HDR-текстуры неба, а не процедурно генерировать небо и облака. Очевидным недостатком этого является то, что настройка таких вещей, как динамическое время суток (которое нам не понадобилось для The Blacksmith), становится немного сложнее, в то время как основным преимуществом является сохранение полного художественного контроля над небом.
Рэлеевское рассеяние
Рэлеевское рассеяние солнечного света в атмосфере - причина ярко-голубого оттенка дневного неба, а также покраснения солнца и горизонта на восходе и закате.
В нашей эмуляции мы опускаем само солнце и сосредотачиваемся только на моделировании цветов и экстинкции, возникающих при входе и выходе солнечного света. Визуальное представление солнца может быть добавлено либо в текстуру неба, либо как часть рассеивания Ми, либо как спрайт солнечной вспышки, либо в любой другой комбинации. В своей простейшей основе плотность нашего рэлеевского рассеяния сводится к прославленной экспоненциальной функции, модулированной фазовой функцией Рэлея. Однако у нас есть дополнительный контроль над данными, которые в него попадают, и данными, которые мы из него извлекаем. Поскольку мы не моделируем свет с разными длинами волн, проходящий через атмосферу, плотности, которые мы рассчитываем, являются скалярными величинами. Мы используем цветовую рампу HDR, чтобы получить различные оттенки рассеянного света у горизонта и в зените, и применяем функцию, учитывающую расстояние, для составления окончательного оттенка.

Рассеивание ми
Рассеивание солнечного света в атмосфере приводит к появлению яркого ореола вокруг солнца, серо-белого вида облаков и дымки, которую можно наблюдать над загрязненными городами. В отличие от Рэлея, который рассеивает свет почти равномерно, рассеяние Ми сильно направлено вперед.
В нашей эмуляции мы позволили рассеянию Ми в основном представлять дымку и ореол вокруг солнца. Поэтому мы почти всегда тонируем его, чтобы компенсировать тот факт, что наша эмуляция Рэлея игнорирует солнце. Технически наши функции Рэлея и Ми очень похожи, существенное различие заключается в фазовой функции, которая применяется к выходу. Как и во многих других реализациях, мы используем функцию рассеяния Хеней-Гринштейна для управления анизотропией - или направленностью вперед - рассеяния Ми.

Люди, читавшие исследовательские работы, могут посмеяться над нашим выбором имен, учитывая, что мы допускаем определенные "вольности" в том, что включаем в каждую из эмуляций. Мы рано обнаружили, что люди обычно используют имя Рэлея при описании "рассеяния неба" и имя Ми при описании "солнечной дымки", поэтому мы решили просто продолжать использовать эти имена даже после того, как модели реализации были упрощены по сравнению с физическими моделями.
Рассеяние по высоте
Элемент рассеяния по высоте представляет собой мешанину из различных эффектов рассеяния на малых высотах, включая радиационный туман, дымку на земле и низко расположенные облака.
Наша реализация рассеивания высоты довольно проста: плотность высоты рассчитывается на основе заданного уровня моря и падения высоты. Затем масштабируется экспоненциальная плотность на основе расстояния, и все это тонируется в нужный цвет.

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

Собираем все вместе
Теперь остается только соединить различные элементы, чтобы составить окончательное изображение. Сложив элементы Рэлея, Ми и высоты, мы получим красивую композицию из различных цветов рассеяния.

Далее нам нужно убедиться, что мы используем буфер окклюзии по назначению. Мы используем различные параметры силы для настройки степени окклюзии, применяемой к прямому, косвенному, облачному и небесному рассеянию.

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

Мы вынесли атмосферное рассеивание в отдельный проект, который можно получить в Asset Store. Помимо всего кода и шейдеров, составляющих решение, проект также содержит все пресеты конфигурации, использованные для создания изображений в этом посте. Не забудьте просмотреть прилагаемое readme, чтобы узнать, что означают различные параметры конфигурации.
Ссылки:
[1]: Отображение Земли с учетом атмосферного рассеяния
https://nishitalab.org/user/nis/cdrom/sig93_nis.pdf
[1]: Метод отображения цвета неба с учетом многократного рассеяния
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf
[1]: Отображение облаков с учетом многократного анизотропного рассеяния и освещения неба
https://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light
Изображение неба в HDR предоставлено NoEmotionHDRs (Peter Sanitra) / CC BY-ND 4.0. Используется без модификаций.
