В этом посте я объясню, как я использовал Shader Graph URP и встроенную систему частиц Unity для создания этих пушистых космических облаков.

Я объединил ресурсы из двух полезных ресурсов/учебников, чтобы осуществить это:

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

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

Установка

Spacefreighter (ссылка на Itch.io) — симулятор морского боя в космосе, где решения, которые вы принимаете относительно своего флота, оружия и экипажа, так же важны, как и ваши навыки и тактика в боях. Это игра о решениях, компромиссах и взрывах крутых кораблей.

В игре корабли плывут в пространстве, похожем на небо, и сражаются друг с другом. На небе есть облака, и нам нужно было, чтобы наши облака больше походили на небо, а не на океан, поэтому мы знали, что пришло время добавить их. Но облака — сложная штука, особенно когда они так важны для нашего художественного стиля. Проведя небольшое исследование, стало ясно, что лучший путь — создать собственный шейдер. Я все равно хотел узнать больше о Shader Graph, так что это был хороший повод.

Создание шейдера

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

Я знал, что для того, чтобы заставить облака работать, мне нужно построить несколько «подмодулей» и соединить их все вместе.

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

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

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

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

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

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

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

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

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

Результат этих шагов до сих пор был на самом деле приятно смотреть.

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

Вот готовый результат для шейдера

Настройка частиц

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

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

Результат

Результат показан ниже. Обратите внимание на некоторые объекты нашего тестового острова и на светящуюся черную дыру слева.

В видео на Youtube-канале Spacefreighter показано более подробно. Обратите внимание на прозрачность, когда корабль находится внутри облака.

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

Вот об этом! Если у вас есть вопросы или вы просто хотите, чтобы я поделился с вами шейдером напрямую, присоединяйтесь к Spacefreighter Discord. Вы также можете следить за тем, как мы создаем игру, и помогать влиять на то, что мы делаем. И, конечно же, с удовольствием отвечу на любые вопросы.