Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

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

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

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

Здесь можно посмотреть на возможности материала декалей

Материалы для ассетов максимально просты и позволяют менять лишь оттенок поверхности по маске, взятой из текстуры цвета.

Теперь про ассеты.

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2
Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Общее количество ассетов в генераторе, включая меши грунта и различную мелкую растительность - 61

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

Деревья

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Задача была следующая: Набор из шести пирамидальных тополей - сканированные нижние уникальные части деревьев бесшовно блендятся с тайловой корой, самый низ дерева блендится с почвой на которой он стоит, нижняя часть дерева имеет характерную окрашенную часть (для эстетики это делают или в целях защиты деревьев для меня все еще загадка), листва имеет возможность подстраиваться под сезон или вовсе исчезать, у всего этого есть гибко настраиваемый пивотный ветер. Деревья должны быть довольно детализированными и реалистичными, но с ограничением по треугольникам. И все в одном материале. Точнее мастер материал для всех деревьев один, а инстансы разные. Думаю, что это выглядит как довольно логичная задача, а насчет одного материала на меш – меньше слотов меньше дроуколов. В данном случае я мог позволить себе больше инструкций на материал, так как он на ассете всего один.

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

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

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

Ретоп и развертку нижних частей деревьев я делал в гудини, так как там удобно и есть нужные инструменты, в частности ремешеры (бесплатные встроенные ноды и платные сторонние плагины) и упаковщик. Нижнюю часть ствола я развернул в квадрат, со 100% заполнением UV пространства, для этого в гудини тоже есть полезная нода. Теперь кстати и в блендере есть такая функция.

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

Далее я создаю атлас с ветками и листвой, это может занять не мало времени. Пока составишь все листья, пока запечешь, пока примеришь на дереве. И так несколько раз. Этот этап я делаю в SpeedTree, Substance Designer и Photoshop

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

. В итоге я получаю готовое дерево в спидтри с текстурами и «оптимальным» количеством треугольников. Кстати, про треугольники. В случае с деревьями стоило бы сделать лоды, учитывая, что пивотный ветер, анимирующий вертексы, очень не любит, когда вертексов много. Но мне было лень делать лоды и в итоге деревья по 100 -150 к треугольников ушли в наниты.

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

После сборки всего дерева, я проверяю нет ли визуальных багов, все ли в порядке с текстурами, с иерархией. Экспортирую в 3dMax и занимаюсь созданием ветра. Не буду подробно описывать этот этап, так как существует много технических тонкостей, да и в целом это довольно рутинный процесс. Скажу только одно, плагин PivotPainter 2.0 в 3dMax то еще наказание. Подразумеваемый создателями как автоматический процесс он превращается почти полностью в ручную работу, если нужен красивый результат без багов. В итоге, после нескольких часов возни с ветром он готов. Тестирую в Unreal, все ли отрабатывает так как нужно.

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

В итоге обе функции выглядят так.

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Инстанс материала тополя с раскрытыми вкладками слоев и параметров. 487 инструкций на 5 слоев

Breakdown. Процедурный генератор парков на Unreal Engine 5.3 Часть 2

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

Функцию с логикой ветра я поместил в мастер материал и настройки ветра доступны в инстансе во вкладке Details, настройки же самого материала – в Layer Parameters.

В этом коротком видео можно посмотреть все возможности материала.

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

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

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

И в завершении - спасибо что дочитали, оставляйте мнения и вопросы, а я продолжу делиться своим опытом здесь.

Удачи!

66
6 комментариев

Почему на UE5 такие кусты всратые? Будто на юнити делали.
В ждалкере тоже самое ведь.

ты думаешь в UE5 кусты встроены? кустарное производство?

1

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