Пять лет назад мы писали о том, как оживали визуальные эффекты в Returnal, в том числе воксельный рендеринг в реальном времени, благодаря которому Фрайк растворился в объемном тумане. Если вы не читали эту статью, она станет хорошим дополнением к этой.
Вот как развивалась эта история.
При работе над Saros мы не просто развивали то, что создали для Returnal. Мы сделали шаг назад, оглянулись на тридцатилетний опыт разработки движка и перестроили его в единую платформу — Graphite.
Что у нас было и почему мы это изменили
Наш собственный движок частиц NGP (Next-Gen Particles) появился в качестве прототипа для Resogun в 2013 году и с тех пор совершенствовался в каждой игре, вплоть до Returnal. К моменту выхода SAROS движок NGP был уже зрелым, но он стал результатом двенадцати лет постепенных изменений, каждое из которых принималось в контексте конкретной игры.
А потом изменилось кое-что еще — мы сами. Присоединение к PlayStation Studios означало, что мы должны были предоставлять контент на уровне, которого ожидают наши игроки, а наши инструменты и названия, которые мы им дали, уже не соответствовали тому, какой студией мы становились.
Так появился Graphite. Он объединяет в себе симуляцию на графическом процессоре, рендеринг, инструменты и интеграцию с DCC в рамках единой архитектуры, разработанной специально для аппаратного обеспечения PlayStation. NGP не исчез, а стал частью Graphite, усовершенствовавшись и став еще более функциональным.
Каждая игра Housemarque имеет узнаваемый визуальный стиль. Графитовая технология — вот что делает это возможным.
А то, как она работает, кадр за кадром, лучше всего объяснят невероятные люди, которые ее создали:
графический архитектор Housemarque Шарман Джагадисан и старший программист по графике Конста Тойванен расскажут вам о объемном тумане в Saros: о том, как он появился в Returnal, и о двух системах, которые мы создали, чтобы атмосфера Carcosa казалась живой.
Ристо Янккила (архитектор визуальных эффектов) расскажет, как мы дополнили Graphite данными из Houdini, в том числе подробно опишет последовательность появления игроков.
Объемный туман
Туман в играх часто появляется в последнюю очередь, он заполняет пустое пространство и скрывает расстояние до объектов. В Saros мы хотели, чтобы туман был живой частью мира, реагирующей на все, что в нем происходит.
В Returnal наш объемный туман уже реагировал на происходящее, но из-за слишком низкой частоты и сильной временной фильтрации не мог отображать мелкие детали. Для Saros мы разработали два взаимодополняющих решения: низкочастотный туман для создания общей атмосферы и высокочастотный туман для создания эффектов, которые можно увидеть в специальных сюжетных комнатах Carcosa.
Низкочастотный туман
Мы взяли за основу туман из Unreal Engine, представляющий собой воксельную сетку, выровненную по усеченной пирамиде, и переработали значительную его часть в соответствии с нашим видением.
Первой проблемой была временная стабильность. Коэффициент гистерезиса определяет, какую часть данных из предыдущего кадра туман сохраняет: значение по умолчанию в Unreal — 90 % — обеспечивает стабильность изображения, но делает туман медленным при быстром движении камеры и источников света. Мы снизили его до 50 %, используя дрожание синего шума и ограничение глубины, чтобы контролировать наложение спектров.
Для Saros также нужен был туман, который мог бы имитировать все — от рассеянного тумана низкой плотности до густого тумана над землей. Для его реалистичной визуализации мы использовали:
двойную фазовую функцию Хени-Гринштейна, моделирующую рассеяние света в зависимости от угла обзора.
Коэффициент цветного поглощения, определяющий, какая часть света поглощается при прохождении через среду, для гораздо более широкого диапазона цветов, чем в традиционных монохроматических решениях.
Система самозатенения, которая объединяет источники входящего света в доминирующее направление затенения и направляет лучи в его сторону.
Интеграл для физического моделирования освещения неба, обеспечивающий точное освещение удаленных объектов без ущерба для производительности.
Все это придало атмосфере Carcosa реалистичность.
Наконец, низкочастотный туман полностью интерактивен. Адвекция, возникающая при моделировании движения жидкости за игроком, напрямую влияет на гистерезис плотности, благодаря чему каждое движение игрока, снаряд, взрыв и противник становятся различимыми в тумане в режиме реального времени.
Высокочастотный туман
Для высокочастотного тумана мы создали собственный алгоритм трассировки лучей. Чтобы сохранить производительность и при этом добиться высокой точности, мы перед трассировкой объединяем данные разброса в группы вокселей размером 8x8x8, рисуя только те кластеры, которые содержат данные, с заданным пользователем пороговым значением, ограничивающим их количество. При трассировке пустые области между кластерами пропускаются, что позволяет алгоритму делать более крупные шаги там, где это возможно.
Для освещения мы рассчитали световой объем для каждого рассеивающего объема, учитывающий интенсивность излучения от всех источников света, с предварительной самотенью для каждого вокселя источника света. Мы предусмотрели параметры альбедо, поглощения, плотности и затенения, чтобы художники могли выбирать между визуальной составляющей и производительностью для каждого объема.
Затем мы объединили две системы тумана: мы используем данные о рассеянии низкочастотного тумана во время высокочастотного марширования и передаем результаты обратно, чтобы обе системы согласовывались друг с другом.
Варианты использования
Мы использовали высокочастотный объемный туман в нескольких сценах. Один из примеров — пролог, где Арджун сталкивается с дымчатым черепом, к которому прикреплены кабели. Другой пример — так называемые миражи. В четырех наших биомах есть особые сюжетные комнаты, где Арджун сталкивается с дымчатыми существами.
Реактивность — ключевой фактор для всех визуальных эффектов, которые мы создаем, и эти эффекты не стали исключением. Поскольку данные о столкновении не требуют высокого разрешения, мы храним их в отдельном объеме с низким разрешением, в котором для черепа также хранится низкочастотное поле скоростей.
Расширение Graphite с помощью данных из Houdini
Раньше объемные эффекты создавались путем написания выражений для каждого вокселя, отвечающих за излучение плотности, в сочетании с симуляцией жидкости, обеспечивающей адвекцию (направленное движение) поля плотности. Поскольку такой подход с использованием сетки и вокселей является отраслевым стандартом для визуальных эффектов в кино, мы решили начать с него.
В процессе разработки Returnal мы поняли, что нам нужен более точный контроль над тем, где именно генерируется плотность. Логика для каждого вокселя позволяла нам создавать плотность на близлежащих поверхностях или вокселизированных сетках, но при выполнении более сложных задач возникали серьезные проблемы с производительностью. Эффективно создавать плотность только на руке персонажа, а не на всем его вокселизированном теле, в реальном времени было очень сложно.
Чтобы решить эту проблему, мы обратились к частицам для создания объемного излучения. Полностью программируемая система частиц Graphite дала нам прочную основу для точного контроля объемов, что позволило создать два новых инструмента:
Автономный конвейер данных Houdini: позволяет художникам предварительно вычислять в Houdini сложные высокоточные данные, которые было бы слишком затратно генерировать во время работы.
Облачный растеризатор Runtime Point: высокопроизводительный компонент, который принимает смоделированные точки и растеризует их непосредственно в объем в режиме реального времени.
Все это позволило нам отказаться от выражений для каждого вокселя без сохранения состояния и от жесткого моделирования жидкости. Теперь частицы могут точно повторять движения анимированной сетки персонажа, что дает художникам полный контроль над поведением и жизненным циклом эффекта.
На практике художник импортирует анимированного персонажа из Saros в Houdini и с помощью инструментов программы вычисляет начальные позиции и атрибуты для эффекта. Эти готовые данные передаются в игровой движок, где запускается симуляция в реальном времени. На видео ниже точки, сгенерированные в Houdini, практически полностью совпадают с положением персонажа в игре, а пользовательская логика во время выполнения отделяет их от врага при попадании пули. Таким образом, начальные позиции задаются в Houdini, но поведение персонажа динамически меняется в зависимости от действий игрока в реальном времени.
Поскольку художники могут экспортировать любые данные из Houdini в Graphite, можно не ограничиваться статичными частицами, прикрепленными к персонажам. Ниже показано, как частицы движутся по поверхности анимированной сетки: поверхность была развернута в Houdini в 2D-пространство для симуляции, затем экспортирована и сопоставлена с анимированной сеткой в реальном времени.
Движение частиц по телу Арджуна слева. В центре мы извлекаем из частиц поверхность ISO. Справа — объемный туман, создаваемый потоком частиц.
Яркий пример использования этой технологии в игре — появление игрока в Saros. Этот сложный эффект создается в несколько этапов, начиная с автономной работы в Houdini, где мы генерируем сплайны непосредственно на скелетной сетке игрока. При экспорте этих сплайнов в Graphite мы рассматриваем каждую контрольную точку сплайна как отдельную частицу.
Моделирование положения частиц в Houdini. Эти значения используются только в качестве целевых позиций в движке, а движение частиц будет динамически моделироваться во время выполнения.
Во время выполнения программы наша программируемая система частиц управляет поведением этих элементов. Сначала сплайны свободно перемещаются в пространстве, а затем постепенно возвращаются в исходные положения на сетке персонажа.
Мы хотели, чтобы игрок выглядел так, будто он физически формируется из растекающейся «жижи». Marching Cubes придал ему вид вязкой твердой поверхности, а управление с помощью частиц позволило создать последовательность, в которой игрок формируется из отдельных нитей.
Подобно сплайнам, которые генерируют поверхность слизи, мы также можем создавать объемную плотность. В последовательности появления мы разместили несколько сплайнов рядом с игроком и создали вокруг них объемный туман, чтобы имитировать поднимающийся пар или дым.
В качестве завершающего штриха мы добавили искрящиеся частицы, которые сталкиваются с персонажем игрока, используя знаковое поле расстояния, вычисляемое на основе коллизионных капсул игрока. Программируемая система частиц снова дала нам свободу действий: игрок притягивает частицы, но когда они подлетают слишком близко, сетка игрока отталкивает их, создавая эффект выхода из горячей, похожей на лаву жидкости.
Здесь все скомпоновано. Каждый элемент моделируется во время выполнения игры со скоростью 60 кадров в секунду на базовой PS5 без использования готовых ресурсов для моделирования. Это позволяет нам создавать несколько анимаций появления игрока, каждая из которых немного рандомизирована, чтобы при каждом пробуждении игрока анимация выглядела немного по-разному.
Постоянно развивающийся процесс разработки
Судя по тому, что рассказали Ристо, Шарман и Конста, цель нашей технологии всегда была одна: каждая симуляция, каждый эффект, каждое решение по рендерингу призваны заставить вас что-то почувствовать во время игры.
Создавать игры — значит верить в то, что пока невозможно доказать, и единственные, кто может это подтвердить, — это сами игроки. Игроки в Saros своими словами сказали нам, что то, что мы создали, имеет значение. И для нас это важнее всего.
Наши игры будут и дальше вдохновлять нас на разработку технологий для Graphite, демонстрируя возможности PlayStation как платформы. Нам не терпится поделиться с вами этим будущим.


