Aurora Borealis Snow

Большинство ассетов с северным сиянием просто рисуют его на небе. Здесь сияние ещё и освещает землю.

Aurora Borealis Snow — набор для ночных сцен на Universal Render Pipeline. В нём три части: система анимированных полотен сияния, шейдер снега и льда для мешей и шейдер снежного террейна. Все три части связаны между собой.

Демо в браузере на WebGL (только сияние)

Сияние используется в приложении Lumasphere, оно есть в Google Play и App Store.

Aurora Borealis Snow

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

Сияние

Полотна появляются вокруг камеры по кольцу (его параметры настраиваются) и следуют за ней при движении. Поэтому сияние всё время остаётся на одном видимом расстоянии и выглядит как часть неба, а не как геометрия, в которую можно зайти. Каждое полотно — плоскость, которую изгибают две синусоиды. Текстура берётся из двух независимых слоёв флипбук-атласа, слои смешиваются в режиме Add, Multiply или Screen. Полотна плавно появляются, дрейфуют и гаснут, время жизни у каждого случайное. Полотна берутся из пула, во время игры ничего не создаётся.

Все параметры хранятся в ScriptableObject, так что можно собрать несколько вариантов сияния и переключать их одним полем. Переключатель Editor Preview запускает всю систему в Scene View без входа в Play Mode.

Aurora Borealis Snow

Aurora Borealis Snow

Снег

Два шейдера, одна модель освещения. Шейдер для мешей построен на URP Lit: параллакс-смещение, упакованные маски (mask map) и пропускание света (transmission), из-за которого тонкий снег и лёд светятся, когда за ними луна или сияние. Шейдер террейна — полноценная производная от URP TerrainLit, поэтому всё стандартное остаётся на месте: смешивание слоёв по высоте, попиксельные нормали для инстансированного террейна, дыры в террейне, вывод в GBuffer для Deferred, запекание лайтмапов и больше четырёх слоёв через дополнительные проходы. Модель блёсток и пропускания света добавлена поверх.

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

Aurora Borealis Snow

Код открыт и понятен

Полные исходники, без скомпилированных библиотек и без нод-графов, в которых пришлось бы разбираться. Все шейдеры написаны на HLSL вручную, их можно открыть, прочитать и доработать. Модель блёсток вынесена в один include-файл, который подключается в свой шейдер тремя строками. Подробное руководство описывает настройку по шагам, объясняет каждое свойство, перечисляет глобальные свойства шейдеров и сразу называет известные ограничения.

Требования

  • Unity 6000.3 или новее
  • Universal Render Pipeline
  • Путь рендеринга Forward или Forward+ (шейдер террейна поддерживает ещё и Deferred)
  • Линейное цветовое пространство и включённый HDR; очень желателен Bloom override

Aurora Borealis Snow

Возможности

Система сияния

  • Полотна из пула, привязанные к камере — во время игры ничего не создаётся, мусора для сборщика нет
  • Два независимых слоя флипбук-атласа, смешивание Add / Multiply / Screen
  • Деформация вершин двумя синусоидами: низ закреплён, верх раскачивается
  • Маска краёв из текстуры, контур квада никогда не виден
  • Случайные время жизни, дрейф, поворот (yaw), кадр атласа и скорость прокрутки для каждого полотна
  • Плавное появление и затухание, всё задаётся в одном ScriptableObject
  • Editor Preview: вся система работает в Scene View без входа в Play Mode

Aurora Borealis Snow

Освещение от сияния

  • Небольшая проба с кубмапой, обновляемой в реальном времени, снимает только сияние на отдельном слое
  • Съёмка распределена по кадрам, разрешение (16–256 px) и интервал обновления настраиваются
  • Выборка по направлению для каждой снежинки — цвет блёсток правильно меняется по поверхности
  • Направление и цвет сияния с учётом затухания полотен передаются в глобальные свойства шейдеров
  • Если отключить пробу, весь вклад сияния в освещение убирается одним значением

Aurora Borealis Snow

Шейдер снега и льда для мешей

  • На основе URP Lit: тени, дополнительные источники света, reflection probe, SSAO, туман
  • Напрямую поддерживается упаковка масок Quixel Megascans (R — шероховатость, G — AO, B — пропускание, A — высота)
  • Параллакс-смещение по каналу высоты
  • Подповерхностное пропускание света и от основного источника, и от сияния
  • Блёстки в мировых координатах, стабильные на любом расстоянии, с маскированием по альбедо и наклону
  • Смешивание с землёй по шуму: меши утопают в снегу террейна
  • Полный набор проходов: forward, shadow caster, depth, depth-normals

Aurora Borealis Snow

Шейдер снежного террейна

  • Полная производная от URP TerrainLit — всё из стандартного шейдера сохранено
  • Смешивание слоёв по высоте, свой инспектор материала
  • Попиксельные нормали для инстансированного террейна, дыры в террейне, генерация basemap
  • Проход GBuffer для Deferred, meta-проход для запекания лайтмапов
  • Больше четырёх слоёв через дополнительные проходы
  • Та же модель блёсток и пропускания, что и в шейдере для мешей, поэтому материалы выглядят одинаково

Остальное

  • Подробно прокомментированная документация, никаких чёрных ящиков
  • Модель блёсток вынесена в один include — в свой шейдер добавляется тремя строками
  • Подробное руководство: настройка, справка по свойствам, оптимизация производительности, решение проблем
  • Известные ограничения честно описаны, а не спрятаны

Aurora Borealis Snow

Видео

Aurora Borealis Snow

https://www.youtube.com/watch?v=y4PP-YO66g8

Страница в Asset Store: Aurora Borealis Snow