Растительность: советы по созданию
В этой статье описаны принципы моделирования и настройки растений, а также способы достижения наилучшей производительности в сценах с густой растительностью в UNIGINE.
Полигональные растения#
Модели растений на основе полигональных мешей следует использовать для крупных планов и средних расстояний, чтобы максимально реалистично передать внешний вид живой растительности. В проектах, работающих в режиме реального времени, крайне важно использовать оптимизированные 3D-модели деревьев.
В этом разделе вы познакомитесь с основными рекомендациями по созданию растительности в UNIGINE и стороннем программном обеспечении для создания цифрового контента.
Моделирование#
При подготовке 3D-модели дерева с густой листвой не стоит прорабатывать топологию всех веток и листьев. Гораздо эффективнее с точки зрения производительности имитировать мелкие детали с помощью текстур. Основное правило моделей, оптимизированных для работы в реальном времени — «чем меньше полигонов, тем лучше». Соблюдение этого принципа особенно важно при рендеринге густого леса, заполненного различными видами растений и трав.
Поэтому настоятельно рекомендуется подготовить для растения несколько уровней детализации ( LOD), чтобы использовать их на разном расстоянии от камеры.
Общий рабочий процесс моделирования дерева выглядит следующим образом:
-
Создайте несколько небольших веток с листьями и запеките их в текстурные атласы — полученные текстуры будут использоваться в качестве текстур листвы. Вот примеры таких текстур:
-
Создайте низкополигональные меши, которые будут представлять собой фрагменты листвы, и настройте UV-развертку для корректного наложения текстур. Эти фрагменты не обязательно должны быть плоскими — можно экспериментировать с их формой и изгибом. Важно также подготовить как минимум три уровня детализации (LOD), максимально оптимизируя их геометрию:
LOD-ы для листвы -
Создайте ствол с крупными ветвями и проработайте для него уровни детализации. Подготовьте и назначьте необходимые текстуры и материалы.
LOD-ы стволаТакже рекомендуется перенести перенести нормали ствола на прилегающие вершины ветвей, чтобы добиться более естественного вида соединений:
Скорректированные нормали ветвей на стыках обеспечивают более естественный вид -
Распределите LOD-ы фрагментов листвы по ветвям соответствующих LOD-ов ствола, формируя крону дерева:
Использование одинакового количества фрагментов листвы на всех LOD-уровнях может увеличить количество полигонов. Однако этот подход имеет ряд преимуществ:
- Большое разнообразие ветвей позволяет создавать более реалистичные растения.
- Более плавный переход между уровнями детализации. Все элементы можно в любой момент откорректировать, чтобы устранить несоответствия.
- Более гибкий художественный пайплайн позволяет художникам собирать деревья разного размера и возраста из одних и тех же фрагментов.
- Корректная работа постэффектов даже на самых низких LOD-ах (SSAO, SSGI и т.д.).
- Также рекомендуется создать отдельный LOD листвы с низкой детализацией для упрощения отбрасывания теней. Можно продублировать самый низкий LOD, дополнительно его оптимизировать и настроить параметры теней в UNIGINE.
-
Для более естественного слияния с рельефом подготовьте отдельную нижнюю часть ствола с назначенным на нее новым материалом. Для удобства можно объединить её с самым детализированным мешем:
-
Ориентируйте модель так, чтобы при импорте в UNIGINE она загружалась корректно. Сбросьте все трансформации.
Убедитесь, что pivot (центр привязки) меша расположен правильно (очевидно, что все LOD-ы должны иметь одинаковую позицию). Обычно pivot размещают в нижней точке растения для удобства проектирования сцены, но при необходимости его можно сместить, если это необходимо для анимации ствола.
-
В результате модель содержит следующее:
Для удобства рекомендуется добавлять постфиксы к названиям уровней детализации, которые будут использоваться в дальнейшем при импорте.
- Дополнительно можно настроить нормали вершин, цвета вершин и UV-развертку для анимации листьев.
- Экспортируйте модель в рекомендуемый формат FBX.
Настройка внешнего вида растения#
Импортируйте созданную модель в UNIGINE, следуя руководству по импорту FBX, и добавьте растение в сцену.
Чтобы объединить все отдельные объекты в единый Mesh Static, включите Merge Static Meshes в настройках импорта.
Настройка уровней детализации#
Настройте дистанции видимости LOD-уровней, включив опцию Combine By Postfixes и задав соответствующие значения в параметрах импорта.
LOD для отбрасывания теней#
При включенной динамической генерации теней все полигоны рендерятся еще раз для каждого источника света, у которого включено отбрасывание теней. Источники света World могут иметь до 4 каскадов теней, так что количество полигонов может быть огромным, что приводит к значительной нагрузке на производительность. Оценить количество полигонов, рендерящихся в карты теней, можно с помощью Rendering Profiler.
Поэтому лучшей практикой является использование упрощенной (низкополигональной) модели для отбрасывания теней от листвы. Сделайте следующее:
-
Отключите отбрасывание теней для всех LOD-уровней листвы, кроме LOD, который предназначен для отбрасывания теней. Вы можете сделать это одним из следующих способов:
- Отключив флаги Cast Proj and Omni Shadows и Cast World Shadows.
- Выключив все биты в Shadow Mask.
- Отключите отображение LOD-а для теней во всех камерах, выключив все биты ее Viewport Mask.
См. демонстрацию настройки LOD-а для теней в видеоуроке по битовым маскам.
Настройка материалов#
Если в настройках импорта был включен флаг Import Materials, все необходимые материалы уже сгенерированы и назначены поверхностям дерева. Рассмотрим параметры материала, на которые стоит обратить внимание:
- Материал листвы должен быть Alpha-Test, чтобы вырезать тексели в соответствии с альфа-каналом текстуры Albedo.
-
Если блики выглядят некорректно, рекомендуется установить значение Specular на 0.
Некорректное освещение при отладке рендеринга отражений при предварительном просмотре (слева) и итоговом изображении (справа) -
Рассмотрите возможность включения для материала опции Two Sided, чтобы сделать листву более плотной. Но учтите, что это может существенно повлиять на производительность, если в сцене слишком много полигонов.
Режим Backside Normal лучше переключить на To Front Side, так как он обычно дает более реалистичный результат для листвы.
-
Если текстуры делают очевидным, что листва состоит из плоских фрагментов, отличным решением этой проблемы является Angle Fade — этот эффект скрывает полигоны, повернутые к камере под экстремальными углами.
ПримечаниеЭта функция может работать некорректно для мешей с модифицированными нормалями. -
Настройка прозрачности материала листвы необходима для создания реалистичного внешнего вида. Увеличьте значение Translucent, чтобы свет мог проходить сквозь объект.
Также на вкладке States можно включить использование Translucent Map, чтобы указать одноканальную текстуру, которая будет определять непрозрачные части объекта (например, ветки).
ПримечаниеНет необходимости прорисовывать прожилки и мелкие детали листьев в текстуре Translucent, если используется текстура Normal Map, которая задает такие неровности поверхности.Текстура AlbedoТекстура Translucent -
Включите флаг Terrain Lerp для материала нижней части дерева, чтобы создать плавный переход от ствола к ландшафту сцены.
Настройка нормалей вершин#
Так как листва состоит из плоских фрагментов, это приводит к неточностям в затенении. Чтобы улучшить затенение листвы и скрыть то, что меш плоский, отрегулируйте нормали вершин.
Возможные решения:
-
Включите опцию Normals Rotated To Camera, чтобы все нормали поверхности были ориентированы на камеру, игнорируя нормали геометрии. Это быстрый способ исправления проблемы, но он делает освещение всех полигонов одинаковым.
-
Отредактируйте нормали вершин вручную в вашем 3D-редакторе. Перенесите нормали вершин с ограничивающей оболочки, чтобы крона выглядела гладкой и плотной.
ПримечаниеРекомендуется использовать куполообразную ограничивающую оболочку, вытянутую вниз, чтобы избежать ошибок затенения на нижних полигонах.Перенос нормалей с ограничивающей оболочкиВ результате станет менее заметно то, что геометрия листвы плоская (справа):
MIP-карты#
Технология MipMapping , поддерживаемая рендером UNIGINE, подразумевает использование менее детализированных текстур для мелких и удалённых полигонов. При этом мелкие черты листвы исчезают на расстоянии. В некоторых случаях ветки и листья вдали от камеры выглядят толще, чем на крупном плане.
Эту проблему можно решить с помощью следующих подходов:
- Используйте опцию Mip Bias, чтобы сдвинуть расстояние, на котором выполняется переключение между уровнями MIP. Этот параметр существенно влияет на производительность.
- По умолчанию MIP-карты для текстуры генерируются автоматически при импорте с использованием Box-фильтрации, которая может слишком размыть текстуру. Попробуйте переключить тип фильтрации на Point, чтобы получить более четкие MIP-карты.
-
Вы также можете подготовить пользовательские MIP-карты в стороннем программном обеспечении. Например, вот сравнение MIP-карт, созданных с использованием фильтрации Box и более четкой фильтрации Kaiser:
Для импорта текстуры с пользовательскими MIP-уровнями, используйте опцию Combine, если уровни разложены в файле, или сохраните их в формате .texture и импортируйте текстуру с включенной опцией Unchanged.
Анимация#
Включите состояние Vegetation, чтобы активировать набор параметров, связанных с анимацией.
Анимация растительности состоит из анимации ствола и листьев. Чтобы включить обе эти настройки, установите для параметра Animation значение Default или Field.
Настройка Field Animation позволяет воздействовать на растения объемами Field Animation и локально изменять параметры анимации, например, для имитации воздушного потока от вертолёта.
Анимация ствола#
Анимация ствола применяет перемещение вершин на основе пространственного 3D-шума, чтобы имитировать то, как ствол дерева гнется от ветра. Pivot меша считается фиксированной точкой, и чем дальше по оси Z от нее находится вершина, тем дальше она отклоняется.
Таким образом, необходимо правильно расположить Pivot (обычно это самая нижняя точка ствола) и выставить модель так, чтобы ось Z была направлена вверх.
Набор параметров, которые управляют анимацией.
Обратите внимание, что все поверхности растения должны иметь одинаковые параметры анимации ствола, чтобы их движение было синхронизированным.
Анимация листьев#
Анимация листьев — это еще один уровень анимации вершинного шейдера, в основном применяемый к листве, обеспечивающий дополнительное движение деталей. Использование этого типа анимации требует предварительной корректировки геометрии на этапе моделирования.
В редакторе доступно несколько способов анимации листьев. Выберите тип анимации, используя опцию Leaves.
На основе цвета вершин#
Это рекомендуемый подход, обеспечивающий максимальный контроль над листвой: листья визуализируются как полигоны, а цвета вершин используются для анимации.
Движения растительности определяются RGB-каналами цветов вершин следующим образом:
![]() |
Красный канал используется для анимации более мелких или периферийных частей растительности (листьев). Яркие части анимированы, а темные — неподвижны. |
![]() |
Зеленый канал задает порядок движения ветвей с целью их десинхронизации. Последовательность движений начинается от самого светлого элемента к самому темному. |
![]() |
Синий канал определяет, какие части ветвей могут сгибаться. Более светлые части обозначают гнущиеся участки, а более темные участки — жесткие. |
Параметры анимации управляют движением вершин:
Этот подход, как правило, используется для анимации ветвей, даже если они прикреплены к стволу:
При этом связанные поверхности должны иметь одинаковые цвета вершин на соседних вершинах и одинаковые параметры анимации, чтобы их движение было синхронизированным:
На основе UV-развертки#
Это довольно устаревший подход, когда листья визуализируются как стандартные полигоны. Этот подход требует, чтобы для меша был определен 2-й канал UV-развертки.
![]() Анимация геометрии на основе UV-развертки
|
![]() 2-й канал UV-развертки: самые жесткие вершины находятся в левом верхнем углу
|
Анимация использует 2-й канал UV-развертки объекта следующим образом: в UV-развертке [0,1] — pivot для движений объекта и самая жесткая часть объекта, а ближе к [1,0] объект становится более гибким.
![]() |
![]() |
Настройка движения вершин осуществляется через те же параметры анимации.
Billboard#
Billboard (билборд) — наиболее удобный способ анимации удаленной растительности: все четырехугольники визуализируются как билборды, которые всегда смотрят в камеру; 2-й канал UV-развертки определяет размер и движение полигонов. Следовательно, листья в меше листвы должны быть представлены только четырехугольниками.
![]() Куст на основе билбордов
|
![]() Меш куста
|
Анимация использует 2-й канал UV-развертки объекта следующим образом: в UV-сетке [0,1] является pivot-ом для движения билборда, а размер билборда можно изменить, масштабируя полигон в UV-канале.
![]() 1-й канал UV-развертки
|
![]() 2-й канал UV-развертки
|
![]() Меш (вверху) и результат (внизу)
|
Настройка движения полигонов осуществляется через те же параметры анимации.
Глобальные параметры анимации#
Анимация ствола и листьев также контролируется глобальными параметрами анимации растительности. Через эти настройки можно глобально регулировать интенсивность, скорость и эффект ветра для анимации ствола и листьев, а также контролировать погодные условия в каждом мире отдельно.
Обратите внимание, что глобальные параметры — это просто множители для параметров анимации для каждого материала.
Рассадка растений#
Для случайной расстановки большого количества одинаковых мешей по местности используется Mesh Clutter. Mesh Clutter процедурно распределяет объекты и отображает только те объекты, которые находятся в области видимости. Типичный алгоритм выглядит следующим образом:
-
Нажмите Create -> Clutter -> Mesh и укажите ассет с расширением .mesh, который будет использоваться в качестве исходного меша для Mesh Clutter. Щелкните внутри вьюпорта, чтобы разместить новый ноду в мире.
ПримечаниеАссеты .fbx являются контейнерами для ассетов .mesh — щелкните правой кнопкой мыши ассет и выберите Open или дважды щелкните его, чтобы получить доступ к его содержимому. -
Если у вас в мире уже есть настроенное дерево, можно скопировать все материалы и параметры с поверхностей настроенного дерева и вставить их в Mesh Clutter последовательно или по именам поверхностей.
-
Поместите ноду в сцену и установите Size, который покроет всю игровую область.
ПримечаниеРабота объектов Mesh Clutter основана на числах с плавающей запятой, поэтому не рекомендуется использовать размеры, превышающие 10000 по длине и ширине. Если вам нужно заполнить области большего размера, нужно будет вручную разделить один объект Mesh Clutter на сетку из нескольких клаттеров.
Инструмент Sandworm автоматически выполняет разбиение при генерации ландшафта.
- Настройте параметры расстановки: установите нужную плотность в количестве мешей на квадратный юнит; разнообразьте внешний вид леса, рандомизируя параметры масштаба, смещения и поворота.
-
Сделайте объект клаттера дочерним по отношению к ландшафту и включите флаг Intersection, чтобы деревья следовали рельефу поверхности.
ПримечаниеЕсли флаг Intersection включен, включите и выключите его, чтобы принудительно повторно сгенерировать объект Clutter. - Настройте параметры расстояний видимости и плавного исчезновения. Учитывая количество полигонов, которое можно получить в случае густого леса, рекомендуется сделать Mesh Clutter видимым на как можно более коротких расстояниях и использовать объекты Impostor на дальних расстояниях.
-
По умолчанию деревья распределяются по всей территории. Однако можно ограничить зоны растительности несколькими способами:
-
С помощью одноканальной текстуры. Можно подготовить текстуру в стороннем ПО или создать новую и нарисовать маску с нуля. Все объекты Mesh Clutter и Grass, использующие эту текстуру, обновляются на лету.
-
С помощью масок ландшафта. Если в мире используется Landscape Terrain с настроенными масками, то чтобы задать плотность растительности, можно выбрать нужную маску в параметре Mask Terrain:
Также можно отредактировать маску с помощью редактора кистей, и Mesh Clutter обновится на лету.
ПримечаниеВсе данные Landscape Terrain, включая маски, загружаются потоком. Если настройки потоковой загрузки не оптимизированы, возможны задержки при загрузке маски во время запуска мира или при изменении положения камеры, что влияет на производительность генерации Mesh Clutter. -
Также дополнительно есть возможность маскирования по мешу:
-
Вырез по пересечению с объектами:
- Создайте Mesh Static или Decal, который представляет собой объем для вырезки. Включите для него флаг Clutter Interaction.
- Выберите и включите бит маски Intersection у того объекта, который будет использоваться для вырезки.
- Включите тот же бит маски Cutout Intersection объекта Clutter.
- Выключите визуализацию объекта в камере, отключив все биты его маски Viewport и отключив отбрасывание теней этим объектом.
Удаление растительности внутри прямоугольной области
-
-
Оптимизируйте параметр Step для лучшей производительности.
Clutter рендерится в виде 2D-сетки, в каждой ячейке которой случайным образом разбросаны меши в зависимости от плотности и вероятности появления. Генерация мешей в ячейках осуществляется поэтапно, начиная с ближайших ячеек, чтобы снизить нагрузку на ЦП.
Деление на ячейкиЗначение Step задает размер ячейки в юнитах. Таким образом, это значение определяет общее количество ячеек по каждой оси (общий размер делится на шаг). Настоятельно рекомендуется выбирать значения, делящиеся без остатка .
ПримечаниеДля каждой ячейки требуется 1 DIP-вызов, поэтому чем больше количество ячеек (т. е. чем меньше шаг), тем больше снижается производительность. Однако создание большой ячейки занимает больше времени. Когда камера движется достаточно быстро, маленькие ячейки создаются одна за другой очень быстро и плавно, а большие могут появляться внезапно и вызывать небольшую задержку рендеринга.
Таким же образом можно расставлять по ландшафту кусты и участки полигональной травы.
В итоге, комбинируя несколько объектов Mesh Clutter для разных типов деревьев, кустов и травы, можно создать разнообразную растительность.
Расстановка вручную#
В качестве завершающего штриха можно расставить деревья как Static Mesh в нужных местах. Для повышения производительности рекомендуется объединять большое количество одинаковых мешей в объект Mesh Cluster, чтобы рендерить их как единое целое.
Можно запекать идентичные меши внутри их иерархии или собрать все похожие меши в мире. Подробнее о методах объединения в кластеры можно узнать в соответствующей статье.
Другой удобный способ быстрой расстановки участков травы, кустов и деревьев по сцене — это использование кисти для размещения мешей:
-
Переключитесь в режим Cluster Editor:
- Выберите один или несколько объектов Mesh Cluster в сцене или создайте новый с помощью кнопки Create в окне Active Tool.
-
Закрасьте пространство кистью, расставляя меши в сцене:
- При необходимости можно отредактировать кластер вручную, чтобы переместить или удалить меши.
Billboard#
Billboard — это плоский прямоугольный объект, который всегда поворачивается лицом к камере. Использование билбордов вместо полноценных объектов, которые едва видны издалека, значительно упрощает и ускоряет рендеринг.
Импосторы#
В UNIGINE Impostor — это объект, аналогичный билборду, который имитирует внешний вид полигональных мешей, отображая разные участки текстуры в зависимости от угла обзора. Импосторы ускоряют рендеринг геометрии, за счет уменьшения количества полигонов при сохранении визуального качества.
Встроенный инструмент Impostor Creator упрощает создание импосторов для одиночных мешей и объектов Mesh Clutter.
В случае леса на основе Mesh Clutter объект Grass с материалом grass_impostor_base будет использоваться как низкополигональный LOD. При этом параметры объектов Clutter и Grass должны совпадать, чтобы положение и ориентация всех LOD-уровней были одинаковыми.
![]() Mesh Clutter и импосторы
|
![]() Контуры поверхностей мешей и импосторов
|
Объекты Grass также рендерятся в виде 2D-сетки для оптимизации производительности. Параметр Step определяет размер ячейки. видны с гораздо больших расстояний, чем меши, поэтому значение Step следует подбирать соответствующим образом. Можно использовать параметр Subdivision, который делит крупные ячейки травы на более мелкие, чтобы они совпадали с ячейками Mesh Clutter, и таким образом позиции случайно расставленных объектов будут совпадать с позициями импосторов. Следовательно, значение параметра Step объекта Clutter должно соответствовать соотношению значений Step/Subdivision травы.
Трава#
Объект Grass с материалом grass_base может заполнять пустые участки ландшафта и увеличивать плотность низкорослой растительности в сцене. Материал grass_base обладает более низкой детализацией по сравнению с материалом mesh_base, поэтому объект Grass рекомендуется использовать как дополнительный заполняющий слой.
Во-первых, вам нужно подготовить текстуру Diffuse с сегментами, представляющими небольшие пучки травы:
Сегменты размещаются в текстуре следующим образом:
- Столбцы представляют разные виды травы, каждый из которых будет распределен согласно соответствующему каналу текстуры Mask. Поэтому количество столбцов должно совпадать с количеством каналов текстуры Mask, иначе сегменты травы будут нарезаны некорректно.
- Ряды представляют вариации определенного вида травы (более тонкая, густая, запутанная и т. д.). Количество рядов может варьироваться от 1 до 4, и должно совпадать со значением Num Textures.
Для текстуры травы с 4 столбцами следует использовать маску с 4 каналами:
Подробнее о слотах текстур можно узнать в соответствующем разделе.
Высококачественная трава может снижать производительность при рендеринге в больших количествах. Все вычисления распределены по времени и выполняются по ячейкам 2D-сетки, что позволяет выполнять рендеринг, поддерживая интерактивную частоту кадров. Поэтому выбор оптимального значения Step для ячеек критичен для оптимизации.
Дополнительные сведения о создании и настройке травы см. в подробном руководстве: Добавление травы.
Трава: общие рекомендации#
При добавлении травы в сцену рекомендуется следовать нескольким правилам для предотвращения падения производительности:
- Используйте LOD-ы и максимально упрощайте самые дальние LOD-уровни. Расстояние между LOD-уровнями не должно быть слишком большим, так как во время перехода два объекта отображаются одновременно, что влияет на производительность.
- Отключите отбрасывание теней от поверхности травы и используйте тени в экранном пространстве (screen-space shadows).
- Нормали мешей травы должны быть направлены вверх для корректного освещения.
- Сделайте Albedo/Roughness текстур земли, видимой в фоне, похожими на Albedo/Roughness травы. Это обеспечит естественный переход между объектами на дальних расстояниях.
Дополнительная информация#
- Генерация растительности на основе данных о растительном покрове с использованием Sandworm
- Оптимизация травы
- Сэмпл Vegetation
- Дополнение Vegetation
- Демо-проект Fox Hole