Engine & platform

Новая система водоснабжения в Unity 2022 LTS и 2023.1

ADRIEN DE TOCQUEVILLE Graphics Engineer
Jun 28, 2023|18 Мин
Новая система водоснабжения в Unity 2022 LTS и 2023.1
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

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

Сегодня мы рассказываем о новой системе Unity Water System, впервые представленной в HDRP в рамках Tech Stream 2022.2, и уделяем особое внимание рендерингу. Грядущий технический поток 2023.1 расширяет набор функций системы для лучшей интеграции с мирами и игровым процессом.

Создайте океан, озеро, реку или бассейн всего за несколько кликов.

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

Первый шаг - активировать воду в вашем проекте:

  • Активация и настройка воды для каждого уровня качества (визуализация активов трубопровода для каждого уровня качества)
  • Активируйте воду в настройках кадра вашей камеры (камер)
  • Активируйте воду в сцене с помощью переопределения объема Water Rendering, которое позволяет включать рендеринг воды только тогда, когда это необходимо, в зависимости от того, где находится ваша камера.

Как только вода станет активной, вам останется всего несколько кликов, чтобы создать красивые водоемы в меню GameObject. HDRP предоставляет три типа водной поверхности: бассейн, река и океан.

Создайте океан за несколько кликов
Быстрое начало работы с образцами воды
Три из четырех примеров сцен, разработанных в рамках новой водной системы Unity для конвейера рендеринга высокой четкости (HDRP).

Создание водных объектов происходит быстро, но система Water System предоставляет множество инструментов и опций для настройки и интеграции воды в ваш мир и игровой процесс.

Чтобы получить быстрый обзор всех систем и расширений в действии, посмотрите на образцы воды в пакете HDRP (откройте Package Manager > выберите пакет High Definition Render Pipeline в своих активах > выберите образцы воды в разделе Samples).

Мы приводим четыре примера сцен.

Сцена "Бассейн" показывает, как установить разные "бассейны" в одной сцене на разной высоте, а также как использовать пользовательские сетки для рендеринга поверхностей с пользовательскими формами.

Сцена " Остров" демонстрирует океанский водоем и включает в себя водяную маску для удаления волн вокруг острова, деформатор воды для создания волн, декали для размещения пены на пляже, генератор пены для создания пены за волнами и вокруг острова, а также водоотделитель для исключения попадания воды внутрь лодки. В ней также уделяется внимание использованию Burst с API запросов к воде для распараллеливания вычислений множества объектов (например, чаек), которые должны плавать на воде.

Сцена Glacier демонстрирует множество особенностей, включая:

  • Речной водоем
  • Деформатор воды для создания водопада
  • Моделирование течения, чтобы заставить воду течь через ледник
  • API запроса воды, чтобы заставить айсберги плыть по реке
  • Пеногенератор для добавления пены за айсбергами
  • Пользовательская пена на границах реки и для водопадного вихря с помощью Shader Graph и узла Water master
  • Декали для анимации падающей воды в водопаде
  • Пробные каустики для проецирования за пределы воды

Сцена "Линия воды" демонстрирует настройку уровня поверхности воды и подводный рендеринг с помощью пользовательского прохода, создающего большую размытость и имитирующего эффект воды на объективе камеры.

Теперь, когда вы получили полную информацию, давайте рассмотрим каждую систему.

Физически обоснованный рендеринг воды

Система Water System поставляется с готовым физическим шейдером воды, разработанным на основе недавно представленной модели освещения в HDRP, также доступным для Shader Graph для настройки. Вы можете настроить гладкость, преломление, поглощение, диффузию и светорассеивающие свойства водной поверхности.

Цвет рассеивания работает как базовый цвет воды, поэтому вам нужно начать с него, чтобы создать общее ощущение. Затем вы можете изменить расстояние поглощения и цвет преломления, чтобы контролировать прозрачность воды и оттенок, накладываемый на объекты, которые вы видите через преломление воды. Для чистого Карибского моря необходимо большое расстояние поглощения в сочетании с голубым цветом рассеивания и преломления, в то время как для грязной реки нужен темно-коричневый цвет рассеивания и квазипрозрачная река с малым расстоянием поглощения.

В 2022.2 есть ограничения в рендеринге воды, некоторые из которых были устранены в 2023.1 (видимость воды за объемными облаками, точная ватерлиния) или будут устранены в 2023.2 (улучшение производительности, поддержка рендеринга прозрачных поверхностей, перекрывающих воду).

Давайте погрузимся

Если вы, как и мы, являетесь поклонником творчества командора Кусто, вам понравится погружаться под воду с помощью системы Water System. Он может определять, когда камера находится под плоскостью воды, и имитировать подводный рендеринг в соответствии с физическими свойствами воды.

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

Когда камера находится между водой и внешним пространством, образуется ватерлиния, и подводный рендеринг создается на погруженной части камеры. В 2023.1 улучшен рендеринг линии воды, что позволяет настраивать его с помощью пользовательского пропуска (см: Образец сцены "Линия воды").

Волна, волнение, рябь и течения

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

Параметризация моделирования

Волны генерируются процедурно с помощью симуляции быстрого преобразования Фурье (БПФ). Проще говоря, это работает путем суммирования множества простых волн разной частоты, образуя сложные волны. Регулируя диапазон частот, вы можете управлять перемешиванием воды.

Система работает путем сложения различных диапазонов частот, которые мы называем диапазонами.

Полное моделирование осуществляется путем суммирования волн, генерируемых в трех частотных диапазонах

HDRP поддерживает до трех диапазонов, что имитирует три эффекта реального мира на воде и охватывает большинство случаев использования:

  • Волна, представляющая собой волны, возникающие под воздействием луны и дальнего ветра. Он управляется исключительно параметром дальнего ветра и позволяет ориентироваться на направление волны.
  • Возбуждение, представляющее собой хаос, порожденный ветром.
  • Волны, представляющие собой течения или влияние местного ветра. Это полоса с самыми высокими частотами или самыми маленькими волнами, которая добавляет мелкие детали на воду.
Параметры для управления моделированием по диапазону частот в Инспекторе

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

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

Рендеринг с точностью и масштабом

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

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

Система также предоставляет различные опции для баланса между визуальным качеством и производительностью рендеринга. Узнайте больше об оптимизации производительности в нашей документации.

Выборка моделирования

Как мы только что объяснили, симуляция полностью выполняется на GPU для повышения эффективности, но часть ее может быть зеркально отображена на CPU, чтобы вы могли проанализировать высоту воды и течения (например, чтобы заставить объекты плыть по реке).

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

Обратите внимание, что на основе отзывов API сценариев был изменен между версиями 2022.2 и 2023.1 и может потребовать корректировки вашего кода между двумя версиями.

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

Пена

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

Система Water System может автоматически генерировать пену, основываясь на моделировании водоема и скорости ветра на расстоянии для рек и океанов. Затем вы можете регулировать количество пены и настраивать внешний вид, выбирая гладкость и укладку текстуры.

Пена, образующаяся при моделировании воды

В версии 2023.1 был добавлен генератор пены для имитации белой воды на лодочной трассе, волн или скал на открытой воде, так что пена может порождаться и продолжать свой путь в соответствии с волнами. В примере сцены вы увидите различные примеры использования генератора пены: В сцене "Остров" он используется для создания пены на вершине разбивающихся волн и вокруг острова, а в сцене "Ледник" - для создания пены за айсбергами, плывущими по реке.

Пена, нанесенная вручную вокруг скал и на береговые волны с помощью пеногенераторов

С помощью Shader Graph вы можете добавить пользовательскую пену в мастер-узел Water и использовать ее для добавления процедурной пены для таких вещей, как границы реки или вихрь на водопаде. Например, в примере Glacier вихрь на дне водопада создается простым прокручиванием и смешиванием пользовательской текстуры пены в Shader Graph. Пена на границах создается путем проб буфера глубины для приблизительной глубины.

Пена, созданная путем считывания буфера глубины в графике шейдера воды

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

Интеграция с мирами

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

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

  • Water Mask позволяет ослабить или подавить рябь, вздутие и пену на определенном участке водной поверхности.
  • На воду можно добавить декали, чтобы создать локальную пену, изменить гладкость воды или смоделировать небольшие локальные деформации, такие как капли, удары или пользовательская рябь с помощью карты нормалей. Они также могут быть использованы для имитации влажности песка или камней (см. пример сцены "Остров") или каустики на стенах (см. пример сцены "Ледник") независимо от системы водоснабжения. Обратите внимание, что цвет изменить нельзя, так как декали обрабатываются только как полутоновые.
  • Деформаторы воды могут локально изменять симуляцию, создавая волны, как показано в примере Island, или водопад, как показано в примере Glacier.
Производительность и отладка

Мы измерили производительность сцены Glacier, в которой активировано большинство функций на различных консолях, и на основе этого составили профиль Water System. В результате измерений мы узнали, что время рендеринга воды на GPU последних поколений составляет около 4 мс, в то время как на консолях предыдущих поколений на это уходило около 7 мс. Это, конечно, сильно зависит от настроек качества воды, сложности симуляции и количества пикселей воды, отображаемых на экране. Но система достаточно производительна, чтобы без проблем работать на различных платформах.

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

В разделе "Разное" каждой водной поверхности доступны различные режимы отладки для визуализации направления течения, деформации, пены и других масок, наложенных на воду.

Режимы отладки, показывающие ток, деформацию, водяную маску и пену
Демонстрация воды

Чтобы увидеть работу системы Water System на более сложных сценах, мы создали демонстрационный проект, в котором представлены сцены бассейна, острова и реки.

Демонстрационная сцена на острове

Сцена на острове показывает бескрайний океан с волнами, набегающими на берег. В нем показано, как использовать маски воды и создавать деформаторы и генераторы пены с помощью пользовательских текстур рендеринга. Кроме того, с помощью декалей создается сложное взаимодействие с поверхностью воды, когда волна приближается к берегу.

Сцена "Бассейн" демонстрирует водную гладь в помещении с реалистичными цветами, глубиной, подводным пространством и каустикой.

Сцена демонстрации реки

Сцена "Река" демонстрирует использование инстансных квадов и использует карту течения для симуляции потока, а также деколи, пользовательский Shader Graph и VFX Graph для улучшения визуальных эффектов.

Демоверсии можно скачать на GitHub.

Как начать

Чтобы использовать систему водоснабжения, вы должны работать с HDRP и Unity 2022.2 или выше.

Хотя вы можете использовать некоторые из первоначальных функций в версии 2022.2, мы рекомендуем начать с версии 2023.1, в которой было добавлено множество улучшений и функций, включая некоторые изменения в API.

Вы можете загрузить образцы воды в менеджере пакетов, из которого можно начать повторное использование кода и систем образцов. Также посмотрите наш демонстрационный проект WaterScenes на GitHub, где представлены более сложные примеры интеграции водных систем.

Чтобы узнать больше, посмотрите глубокое погружение Реми и Адриана в Water System с GDC 2023 или прочитайте нашу документацию.

Что дальше?

На данном этапе мы пока не планируем никаких новых функций и в настоящее время концентрируемся на стабильности. Вы можете поделиться с нами своими отзывами или задать вопросы в нашей специальной теме на форуме Unity.

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

Пожалуйста, поделитесь отзывами о новой системе водоснабжения на форуме HDRP. Чтобы узнать о будущих технических блогах разработчиков Unity, следите за продолжающейся серией Tech from the Trenches.