0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>7 авг 2024</li>
2
<ul><li>7 авг 2024</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Доклад Аррана Лэнгмида, технического художника Epic Games.</p>
4
</ul><p>Доклад Аррана Лэнгмида, технического художника Epic Games.</p>
5
<p>Иллюстрация: Unreal Engine / Annie для Skillbox Media</p>
5
<p>Иллюстрация: Unreal Engine / Annie для Skillbox Media</p>
6
<p>Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.</p>
6
<p>Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.</p>
7
<p>Технология виртуальной геометрии Nanite - одна из главных ключевых особенностей Unreal Engine 5, которая позволяет рендерить сцены с миллионами полигонов. Тем не менее многие разработчики всё ещё критично относятся к ней и не спешат использовать в своих проектах. На GDC 2024 старший технический художник Epic Games Арран Лэнгмид разобрал несколько актуальных проблем, связанных с Nanite, и продемонстрировал варианты их решения.</p>
7
<p>Технология виртуальной геометрии Nanite - одна из главных ключевых особенностей Unreal Engine 5, которая позволяет рендерить сцены с миллионами полигонов. Тем не менее многие разработчики всё ещё критично относятся к ней и не спешат использовать в своих проектах. На GDC 2024 старший технический художник Epic Games Арран Лэнгмид разобрал несколько актуальных проблем, связанных с Nanite, и продемонстрировал варианты их решения.</p>
8
Полная версия доклада Аррана Лэнгмида на GDC 2024<p>С обновления 5.4 в Unreal Engine появилась русская локализация, поэтому для удобства в докладе представлены русскоязычные названия функций с их аналогом на английском языке в скобках. Если какую-то функцию в движке ещё не перевели на русский язык, оригинальное название сохраняется и дополнительно выделяется жирным шрифтом.</p>
8
Полная версия доклада Аррана Лэнгмида на GDC 2024<p>С обновления 5.4 в Unreal Engine появилась русская локализация, поэтому для удобства в докладе представлены русскоязычные названия функций с их аналогом на английском языке в скобках. Если какую-то функцию в движке ещё не перевели на русский язык, оригинальное название сохраняется и дополнительно выделяется жирным шрифтом.</p>
9
<p>Более десяти лет преподавал основы игрового арта, а также дисциплины, связанные с 3D-графикой, в Солентском университете в Великобритании. Помимо этого, он занимался разработкой игр и успел выпустить мультиплатформенную гонку "<a>Bears Can’t Drift!?</a>". В настоящий момент уже более шести лет работает в Epic Games техническим<a>художником</a>и консультирует других разработчиков по вопросам, связанным с Unreal Engine.</p>
9
<p>Более десяти лет преподавал основы игрового арта, а также дисциплины, связанные с 3D-графикой, в Солентском университете в Великобритании. Помимо этого, он занимался разработкой игр и успел выпустить мультиплатформенную гонку "<a>Bears Can’t Drift!?</a>". В настоящий момент уже более шести лет работает в Epic Games техническим<a>художником</a>и консультирует других разработчиков по вопросам, связанным с Unreal Engine.</p>
10
<p>Уникальность технологии Nanite состоит в том, что она<a>преобразовывает</a>полигональную структуру объекта в собственную виртуальную сетку, разбивая её на огромное количество треугольников. При этом осуществляется рендеринг<strong>только тех участков меша, которые видны с конкретного ракурса</strong>. Вкупе с экономичным форматом данных системы Nanite обеспечивает корректное отображение большого множества объектов в кадре.<a>Уровни детализации (LOD)</a>рассчитываются автоматически.</p>
10
<p>Уникальность технологии Nanite состоит в том, что она<a>преобразовывает</a>полигональную структуру объекта в собственную виртуальную сетку, разбивая её на огромное количество треугольников. При этом осуществляется рендеринг<strong>только тех участков меша, которые видны с конкретного ракурса</strong>. Вкупе с экономичным форматом данных системы Nanite обеспечивает корректное отображение большого множества объектов в кадре.<a>Уровни детализации (LOD)</a>рассчитываются автоматически.</p>
11
<p>И всё же бездумно подключать эту функцию в надежде, что она сможет отрендерить десятки миллионов полигонов, не стоит. Nanite демонстрирует свою эффективность далеко не в каждой сцене.</p>
11
<p>И всё же бездумно подключать эту функцию в надежде, что она сможет отрендерить десятки миллионов полигонов, не стоит. Nanite демонстрирует свою эффективность далеко не в каждой сцене.</p>
12
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Например, на скриншоте выше представлена визуализация леса с большим камнем на переднем плане. Чтобы увидеть внутренние процессы виртуальной геометрии, можно открыть вкладку<strong>С освещением</strong>(Lit) -<strong>Визуализация Nanite</strong>(Nanite Visualisation). В ней находятся режимы визуализации, отображающие работу Nanite в конкретной сцене. И если выбрать режим<strong>Замена</strong>(Overdraw), который отвечает за отображение избыточных треугольников, перекрывающих друг друга, можно увидеть следующую картину.</p>
12
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Например, на скриншоте выше представлена визуализация леса с большим камнем на переднем плане. Чтобы увидеть внутренние процессы виртуальной геометрии, можно открыть вкладку<strong>С освещением</strong>(Lit) -<strong>Визуализация Nanite</strong>(Nanite Visualisation). В ней находятся режимы визуализации, отображающие работу Nanite в конкретной сцене. И если выбрать режим<strong>Замена</strong>(Overdraw), который отвечает за отображение избыточных треугольников, перекрывающих друг друга, можно увидеть следующую картину.</p>
13
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Фиолетовым отмечена область без перекрытия, в данном случае камень и ландшафт. Ассеты деревьев содержат очень много треугольников из-за комплексной структуры ветвей. К тому же они расположены достаточно близко друг к другу, в результате чего происходит наслоение геометрии. Иными словами, на одно и то же количество пикселей Nanite приходится отрисовывать больше треугольников, что в итоге замедляет рендеринг. Именно поэтому практически вся область с лесом отображается в ярко-жёлтом цвете - и с такой сценой Nanite покажет себя малоэффективно.</p>
13
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Фиолетовым отмечена область без перекрытия, в данном случае камень и ландшафт. Ассеты деревьев содержат очень много треугольников из-за комплексной структуры ветвей. К тому же они расположены достаточно близко друг к другу, в результате чего происходит наслоение геометрии. Иными словами, на одно и то же количество пикселей Nanite приходится отрисовывать больше треугольников, что в итоге замедляет рендеринг. Именно поэтому практически вся область с лесом отображается в ярко-жёлтом цвете - и с такой сценой Nanite покажет себя малоэффективно.</p>
14
<p>В презентации Арран предлагает несколько техник, которые помогут избежать проблем с оптимизацией при использовании Nanite. Но чтобы выявить причину, почему виртуальная геометрия столь избирательна к типам ассетов, для начала стоит рассмотреть примеры, где технология показывает наилучшие результаты.</p>
14
<p>В презентации Арран предлагает несколько техник, которые помогут избежать проблем с оптимизацией при использовании Nanite. Но чтобы выявить причину, почему виртуальная геометрия столь избирательна к типам ассетов, для начала стоит рассмотреть примеры, где технология показывает наилучшие результаты.</p>
15
<p>Nanite лучше всего раскрывает свой потенциал на ассетах со смежной геометрией. Под этим подразумевается структура с непрерывной полигональной сеткой. Например, как у камня, представленного на скриншоте ниже.</p>
15
<p>Nanite лучше всего раскрывает свой потенциал на ассетах со смежной геометрией. Под этим подразумевается структура с непрерывной полигональной сеткой. Например, как у камня, представленного на скриншоте ниже.</p>
16
Ассет камня, который насчитывает 2 миллиона треугольников<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Арран уточняет, что для корректной работы Nanite весь меш необязательно должен быть цельным, но чем больше геометрии образует единую полигональную сетку, тем лучше.</p>
16
Ассет камня, который насчитывает 2 миллиона треугольников<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Арран уточняет, что для корректной работы Nanite весь меш необязательно должен быть цельным, но чем больше геометрии образует единую полигональную сетку, тем лучше.</p>
17
<p>Если в уже ранее упомянутом разделе<strong>Визуализация Nanite</strong>(Nanite Visualization) выбрать режим отображения<strong>Скоплений</strong>(Clusters), можно увидеть кластерную структуру ассета в реальном времени.</p>
17
<p>Если в уже ранее упомянутом разделе<strong>Визуализация Nanite</strong>(Nanite Visualization) выбрать режим отображения<strong>Скоплений</strong>(Clusters), можно увидеть кластерную структуру ассета в реальном времени.</p>
18
<em>Видео: Unreal Engine / YouTube</em><p>На кадрах видно, что полигональная сетка разбита на тысячи мелких кластеров - каждый из них представляет собой группу треугольников. При приближении или отдалении камеры от объекта меняется и размер кластеров. Этот процесс схож с работой модификаторов по упрощению геометрии, которые встречаются в программах для 3D-моделирования. И если, к примеру, приблизиться к краю объекта вплотную, детализация остаётся на высоком уровне. Потоковая передача данных происходит очень быстро, так как рендерится только небольшой, видимый фрагмент ассета.</p>
18
<em>Видео: Unreal Engine / YouTube</em><p>На кадрах видно, что полигональная сетка разбита на тысячи мелких кластеров - каждый из них представляет собой группу треугольников. При приближении или отдалении камеры от объекта меняется и размер кластеров. Этот процесс схож с работой модификаторов по упрощению геометрии, которые встречаются в программах для 3D-моделирования. И если, к примеру, приблизиться к краю объекта вплотную, детализация остаётся на высоком уровне. Потоковая передача данных происходит очень быстро, так как рендерится только небольшой, видимый фрагмент ассета.</p>
19
<p>Поэтому Nanite хорошо работает со смежной геометрией с точки зрения групп сглаживания, UV и цветов вершин.</p>
19
<p>Поэтому Nanite хорошо работает со смежной геометрией с точки зрения групп сглаживания, UV и цветов вершин.</p>
20
<p>Это явление возникает, когда ассет на переднем плане блокирует рендеринг объектов, расположенных позади. В примере ниже включён режим<strong>Замены</strong>(Overdraw), и когда камера приближается вплотную к каменной глыбе, движок рендерит только её видимую поверхность, игнорируя стены и арку позади.</p>
20
<p>Это явление возникает, когда ассет на переднем плане блокирует рендеринг объектов, расположенных позади. В примере ниже включён режим<strong>Замены</strong>(Overdraw), и когда камера приближается вплотную к каменной глыбе, движок рендерит только её видимую поверхность, игнорируя стены и арку позади.</p>
21
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Пример также демонстрирует эффективность Nanite в распознавании и визуализации значимых объектов в зависимости от ракурса.</p>
21
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Пример также демонстрирует эффективность Nanite в распознавании и визуализации значимых объектов в зависимости от ракурса.</p>
22
<p>Под этим подразумеваются объекты со структурой, которая не соприкасается с другими полигональными сетками. В сцене ниже в режиме<strong>Замены</strong>(Overdraw) можно заметить большое оранжевое пятно и несколько мелких пятен, которые то и дело появляются на ассете булыжника. Это явление происходит из-за того, что в качестве примера Арран специально разместил позади большого камня ещё один поменьше и продублировал его 30 раз, прислонив к первичному мешу.</p>
22
<p>Под этим подразумеваются объекты со структурой, которая не соприкасается с другими полигональными сетками. В сцене ниже в режиме<strong>Замены</strong>(Overdraw) можно заметить большое оранжевое пятно и несколько мелких пятен, которые то и дело появляются на ассете булыжника. Это явление происходит из-за того, что в качестве примера Арран специально разместил позади большого камня ещё один поменьше и продублировал его 30 раз, прислонив к первичному мешу.</p>
23
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>В результате в геометрии образовались слои, и Nanite уже сложно распознать, какой именно слой необходимо отрендерить, а какой скрыть.</p>
23
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>В результате в геометрии образовались слои, и Nanite уже сложно распознать, какой именно слой необходимо отрендерить, а какой скрыть.</p>
24
<p>При соблюдении всех трёх условий, перечисленных выше, Nanite может показывать весьма достойные результаты в области оптимизации.</p>
24
<p>При соблюдении всех трёх условий, перечисленных выше, Nanite может показывать весьма достойные результаты в области оптимизации.</p>
25
<p>Арран отмечает, что от пользователей часто поступают запросы касательно оптимизации ассетов огромного размера, так как они начинают занимать слишком много места на жёстком диске.</p>
25
<p>Арран отмечает, что от пользователей часто поступают запросы касательно оптимизации ассетов огромного размера, так как они начинают занимать слишком много места на жёстком диске.</p>
26
<p>Эту проблему можно решить, воспользовавшись новой экспериментальной функцией в контексте тесселяции Nanite, которая появилась в обновлении 5.4. Её возможности демонстрировали на презентации<a>State of Unreal 2024</a>на примере разработки детального окружения для игры Marvel 1943: Rise of Hydra.</p>
26
<p>Эту проблему можно решить, воспользовавшись новой экспериментальной функцией в контексте тесселяции Nanite, которая появилась в обновлении 5.4. Её возможности демонстрировали на презентации<a>State of Unreal 2024</a>на примере разработки детального окружения для игры Marvel 1943: Rise of Hydra.</p>
27
<p>Рассмотрим, как это нововведение поможет сэкономить ресурсы на примере сцены ниже, где в центре внимания - два больших камня, расположенных с краю.</p>
27
<p>Рассмотрим, как это нововведение поможет сэкономить ресурсы на примере сцены ниже, где в центре внимания - два больших камня, расположенных с краю.</p>
28
<p>Режим визуализации<strong>Треугольники</strong>(Triangles) на втором кадре демонстрирует примерно одинаковую плотность геометрии Nanite у обоих ассетов. Но на самом деле геометрия камня справа основана на низкополигональной сетке объекта, который находится позади него. И объём нового ассета на диске занимает столько же места, сколько низкополигональный меш.</p>
28
<p>Режим визуализации<strong>Треугольники</strong>(Triangles) на втором кадре демонстрирует примерно одинаковую плотность геометрии Nanite у обоих ассетов. Но на самом деле геометрия камня справа основана на низкополигональной сетке объекта, который находится позади него. И объём нового ассета на диске занимает столько же места, сколько низкополигональный меш.</p>
29
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Добиться такого результата достаточно просто. Если выделить камень справа и открыть<a>Material Editor</a>, в разделе<strong>Граф Материалов</strong>(Material Graph) можно увидеть, что в главном ноде, который отвечает за вывод, появился новый слот<strong>Толщина поверхности</strong>(Displacement). К нему можно подключить карту высот (Height Map) или любую другую<a>карту</a>, в которая содержит информацию о рельефе поверхности.</p>
29
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Добиться такого результата достаточно просто. Если выделить камень справа и открыть<a>Material Editor</a>, в разделе<strong>Граф Материалов</strong>(Material Graph) можно увидеть, что в главном ноде, который отвечает за вывод, появился новый слот<strong>Толщина поверхности</strong>(Displacement). К нему можно подключить карту высот (Height Map) или любую другую<a>карту</a>, в которая содержит информацию о рельефе поверхности.</p>
30
<em>Видео: Unreal Engine / YouTube</em><p>Затем в <strong>Сведениях</strong>(Details) материала в строке поиска можно набрать<strong>Nanite</strong>и дополнительно установить величину смещения рельефа -<strong>Magnitude</strong>. А чуть ниже в пункте<strong>Center</strong> - указать значение смещения рельефа вверх или вниз. Далее необходимо поставить галочку напротив<strong>Enable Tessellation</strong>, что активирует тесселяцию Nanite для данного ассета.</p>
30
<em>Видео: Unreal Engine / YouTube</em><p>Затем в <strong>Сведениях</strong>(Details) материала в строке поиска можно набрать<strong>Nanite</strong>и дополнительно установить величину смещения рельефа -<strong>Magnitude</strong>. А чуть ниже в пункте<strong>Center</strong> - указать значение смещения рельефа вверх или вниз. Далее необходимо поставить галочку напротив<strong>Enable Tessellation</strong>, что активирует тесселяцию Nanite для данного ассета.</p>
31
Подключение<strong>Nanite Tesselation</strong>в редакторе материалов<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Таким образом новый рельеф будет занимать столько же места на жёстком диске, сколько карта высот. Недостаток тесселяции в том, что её применение подразумевает динамический процесс, то есть виртуальная геометрия может меняться в зависимости от карты высот. И при активном слоте<strong>Толщина поверхности</strong>(Displacement) Nanite создаёт дополнительные треугольники, чтобы поверхность соответствовала рисунку карты высот. Чем больше плотность пикселей - тем больше генерируется треугольников. В свою очередь, такой подход хуже сказывается на производительности, если сравнивать с виртуальной геометрией Nanite, меняющейся в зависимости от обзора. Рассмотрим это явление на практике.</p>
31
Подключение<strong>Nanite Tesselation</strong>в редакторе материалов<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Таким образом новый рельеф будет занимать столько же места на жёстком диске, сколько карта высот. Недостаток тесселяции в том, что её применение подразумевает динамический процесс, то есть виртуальная геометрия может меняться в зависимости от карты высот. И при активном слоте<strong>Толщина поверхности</strong>(Displacement) Nanite создаёт дополнительные треугольники, чтобы поверхность соответствовала рисунку карты высот. Чем больше плотность пикселей - тем больше генерируется треугольников. В свою очередь, такой подход хуже сказывается на производительности, если сравнивать с виртуальной геометрией Nanite, меняющейся в зависимости от обзора. Рассмотрим это явление на практике.</p>
32
<em>Видео: Unreal Engine / YouTube</em><p>Когда Арран вновь переходит в режим визуализации<strong>Треугольники</strong>(Triangles) и отдаляет камеру, можно заметить, что у камня слева структура треугольников изменяется в зависимости от расстояния, а у камня справа она остаётся прежней. Как уже упоминалось выше, алгоритм Nanite автоматически подстраивается под расстояние камеры по отношению к объекту, и чем дальше расположена камера, тем меньше требуется треугольников для визуализации объекта. Но структура камня справа с подключённой тесселяцией не может адаптироваться под уровни детализации.</p>
32
<em>Видео: Unreal Engine / YouTube</em><p>Когда Арран вновь переходит в режим визуализации<strong>Треугольники</strong>(Triangles) и отдаляет камеру, можно заметить, что у камня слева структура треугольников изменяется в зависимости от расстояния, а у камня справа она остаётся прежней. Как уже упоминалось выше, алгоритм Nanite автоматически подстраивается под расстояние камеры по отношению к объекту, и чем дальше расположена камера, тем меньше требуется треугольников для визуализации объекта. Но структура камня справа с подключённой тесселяцией не может адаптироваться под уровни детализации.</p>
33
<p>С другой стороны, полученный путём тесселяции рельеф можно изменять в реальном времени, смешивая с другими объёмными слоями кистью: откройте вкладку<strong>режим "Выбор"</strong>(Selection Mode) -<strong>Режим "Ландшафт"</strong>(Landscape Mode) и уже в нём переключитесь на режим<strong>Окрашивания</strong>(Paint).</p>
33
<p>С другой стороны, полученный путём тесселяции рельеф можно изменять в реальном времени, смешивая с другими объёмными слоями кистью: откройте вкладку<strong>режим "Выбор"</strong>(Selection Mode) -<strong>Режим "Ландшафт"</strong>(Landscape Mode) и уже в нём переключитесь на режим<strong>Окрашивания</strong>(Paint).</p>
34
<em>Видео: Unreal Engine / YouTube</em><p>Главное преимущество такого подхода - это создание цельной объёмной поверхности, которая исключает нежелательное в контексте Nanite наслоение нескольких типов ассетов друг на друга. Иными словами, не нужно размещать огромное количество камней и веток на ландшафте, их можно просто добавить с помощью кисти, как в примере выше.</p>
34
<em>Видео: Unreal Engine / YouTube</em><p>Главное преимущество такого подхода - это создание цельной объёмной поверхности, которая исключает нежелательное в контексте Nanite наслоение нескольких типов ассетов друг на друга. Иными словами, не нужно размещать огромное количество камней и веток на ландшафте, их можно просто добавить с помощью кисти, как в примере выше.</p>
35
<p>Впрочем, при необходимости уровень тесселяции можно уменьшить для всей сцены. Для этого нужно набрать в консольной строке команду<strong>r.Nanite.DicingRate</strong>и через пробел указать значение разрешения Nanite. Чем оно выше, тем меньше треугольников в сцене.</p>
35
<p>Впрочем, при необходимости уровень тесселяции можно уменьшить для всей сцены. Для этого нужно набрать в консольной строке команду<strong>r.Nanite.DicingRate</strong>и через пробел указать значение разрешения Nanite. Чем оно выше, тем меньше треугольников в сцене.</p>
36
Набор команды в консольной строке Unreal Editor<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Например, если ввести значение<strong>r.Nanite.DicingRate 8</strong>, разрешение Nanite у объектов с включённой тесселяцией уменьшится. Таким образом можно изменять разрешение в зависимости от текущих задач.</p>
36
Набор команды в консольной строке Unreal Editor<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Например, если ввести значение<strong>r.Nanite.DicingRate 8</strong>, разрешение Nanite у объектов с включённой тесселяцией уменьшится. Таким образом можно изменять разрешение в зависимости от текущих задач.</p>
37
Результат изменения уровня тесселяции после введения команды<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Зная о рекомендуемых типах геометрии для использования Nanite, можно сделать вывод, что ассеты деревьев не просто не вписываются в эти требования, а устроены с точностью до наоборот.</p>
37
Результат изменения уровня тесселяции после введения команды<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Зная о рекомендуемых типах геометрии для использования Nanite, можно сделать вывод, что ассеты деревьев не просто не вписываются в эти требования, а устроены с точностью до наоборот.</p>
38
<ul><li>Меш дерева состоит из отдельных элементов (ствол, ветки, плоскости листьев).</li>
38
<ul><li>Меш дерева состоит из отдельных элементов (ствол, ветки, плоскости листьев).</li>
39
<li>Специфическая структура не может перекрыть собой другие объекты в сцене (сквозь ветки можно увидеть другие объекты, к тому же деревья в сцене, как правило, подвижны).</li>
39
<li>Специфическая структура не может перекрыть собой другие объекты в сцене (сквозь ветки можно увидеть другие объекты, к тому же деревья в сцене, как правило, подвижны).</li>
40
<li>Ветки расположены очень близко друг к другу, в результате происходит наслоение геометрии.</li>
40
<li>Ветки расположены очень близко друг к другу, в результате происходит наслоение геометрии.</li>
41
</ul><p>Все эти факторы осложняют рендеринг, так как Nanite сложнее распознать, какую геометрию нужно отобразить и какие объекты необходимо отрендерить в первую очередь.</p>
41
</ul><p>Все эти факторы осложняют рендеринг, так как Nanite сложнее распознать, какую геометрию нужно отобразить и какие объекты необходимо отрендерить в первую очередь.</p>
42
<p>Тем не менее Epic Games постоянно ищет наиболее удачные способы оптимизации флоры в Unreal Engine 5. И в рамках своего доклада Арран предложил метод, который разработчики могут опробовать уже сейчас.</p>
42
<p>Тем не менее Epic Games постоянно ищет наиболее удачные способы оптимизации флоры в Unreal Engine 5. И в рамках своего доклада Арран предложил метод, который разработчики могут опробовать уже сейчас.</p>
43
<p>До появления Nanite движок поддерживал ассеты деревьев, ветки или листья которых состояли в основном из плоскостей с текстурами. С одной стороны подобные модели удачно смотрятся в сценах общего плана, но при акценте на деталях пересечения плоскостей начинают сильно бросаться в глаза.</p>
43
<p>До появления Nanite движок поддерживал ассеты деревьев, ветки или листья которых состояли в основном из плоскостей с текстурами. С одной стороны подобные модели удачно смотрятся в сценах общего плана, но при акценте на деталях пересечения плоскостей начинают сильно бросаться в глаза.</p>
44
На скриншоте можно заметить стыки плоскостей веток<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Как правило, модель дерева состоит из нескольких компонентов: ствол, ветви и большое количество сгенерированных листьев-плоскостей, которые размещены по всей кроне в разных точках. Сосна из примера выше, созданная Арраном, представляет собой ствол, на котором размещено множество копий одной ветки с иглами, заранее подготовленной художником в Blender. Закончив сборку дерева, Арран запёк всю конструкцию в один ассет.</p>
44
На скриншоте можно заметить стыки плоскостей веток<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Как правило, модель дерева состоит из нескольких компонентов: ствол, ветви и большое количество сгенерированных листьев-плоскостей, которые размещены по всей кроне в разных точках. Сосна из примера выше, созданная Арраном, представляет собой ствол, на котором размещено множество копий одной ветки с иглами, заранее подготовленной художником в Blender. Закончив сборку дерева, Арран запёк всю конструкцию в один ассет.</p>
45
В новом ассете дерева сосновые ветки стали объёмными. В правом нижнем углу представлены ассеты использованных веток с уровнями детализации<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Если открыть ассет этой сосны в отдельном окне, статистика в левом верхнем углу вьюпорта покажет, что меш содержит чуть больше 4,5 миллиона треугольников Nanite (пункт<strong>Треугольники Nanite</strong>(Nanite Triangles) выделен синим на скриншоте ниже). На самом деле это относительно небольшое значение, если меш соответствует требованиям Nanite, о которых упоминалось ранее. Но в данном случае речь идёт о дереве, поэтому процессы преобразования данных и оптимизации значительно усложняются.</p>
45
В новом ассете дерева сосновые ветки стали объёмными. В правом нижнем углу представлены ассеты использованных веток с уровнями детализации<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Если открыть ассет этой сосны в отдельном окне, статистика в левом верхнем углу вьюпорта покажет, что меш содержит чуть больше 4,5 миллиона треугольников Nanite (пункт<strong>Треугольники Nanite</strong>(Nanite Triangles) выделен синим на скриншоте ниже). На самом деле это относительно небольшое значение, если меш соответствует требованиям Nanite, о которых упоминалось ранее. Но в данном случае речь идёт о дереве, поэтому процессы преобразования данных и оптимизации значительно усложняются.</p>
46
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>На скриншоте также можно увидеть, что ассет дерева занимает 271 МБ, причём 150 МБ отведено под геометрию Nanite. Эта информация прописана в пункте<strong>Предварительный размер сжатого диска</strong>(<em>Estimated Comressed Disk Size</em>) - на скриншоте подчёркнута красной линией.</p>
46
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>На скриншоте также можно увидеть, что ассет дерева занимает 271 МБ, причём 150 МБ отведено под геометрию Nanite. Эта информация прописана в пункте<strong>Предварительный размер сжатого диска</strong>(<em>Estimated Comressed Disk Size</em>) - на скриншоте подчёркнута красной линией.</p>
47
<p>Для сравнения Арран продемонстрировал статистику ассета камня, структура которого лучше адаптирована под Nanite. Пункт<strong>Треугольники Nanite</strong>(Nanite Triangles) показывает, что ассет содержит ровно 2 миллиона треугольников Nanite. Но при этом в пункте<strong>Предварительный размер сжатого диска</strong>(Estimated Comressed Disk Size) указано, что геометрия Nanite занимает чуть больше 16 МБ.</p>
47
<p>Для сравнения Арран продемонстрировал статистику ассета камня, структура которого лучше адаптирована под Nanite. Пункт<strong>Треугольники Nanite</strong>(Nanite Triangles) показывает, что ассет содержит ровно 2 миллиона треугольников Nanite. Но при этом в пункте<strong>Предварительный размер сжатого диска</strong>(Estimated Comressed Disk Size) указано, что геометрия Nanite занимает чуть больше 16 МБ.</p>
48
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Эти примеры ещё раз подтверждают, что технологии сложно оптимизировать меши, структура которых не соответствует трём пунктам, упомянутых в материале ранее.</p>
48
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Эти примеры ещё раз подтверждают, что технологии сложно оптимизировать меши, структура которых не соответствует трём пунктам, упомянутых в материале ранее.</p>
49
<p>Тем не менее ограничение в контексте деревьев можно обойти, если правильно разбить структуру дерева на составляющие, задействовав при этом фреймворк с процедурной генерацией контента<a><strong>Procedural Content Generation</strong></a>(или просто<strong>PCG</strong>).</p>
49
<p>Тем не менее ограничение в контексте деревьев можно обойти, если правильно разбить структуру дерева на составляющие, задействовав при этом фреймворк с процедурной генерацией контента<a><strong>Procedural Content Generation</strong></a>(или просто<strong>PCG</strong>).</p>
50
<p>Плагин<strong>PCG</strong>необходимо подключить в движке в настройках, после чего он будет доступен всегда. Открываем вкладку<strong>Правка</strong>(Edit) -<strong>Плагины</strong>(Plugins), в строке поиска набираем<strong>Procedural</strong>и отмечаем галочками плагины<strong>Procedural Content Generation Framework</strong>и <strong>Procedural Content Generation Framework Geometry Script Interop</strong>. После этого в меню создания блюпринтов появится процедурная генерация контента<strong>Граф PCG</strong>(PCGGraph) и<strong>Экземпляр Графа PCG</strong>(PCGGraph Instance).</p>
50
<p>Плагин<strong>PCG</strong>необходимо подключить в движке в настройках, после чего он будет доступен всегда. Открываем вкладку<strong>Правка</strong>(Edit) -<strong>Плагины</strong>(Plugins), в строке поиска набираем<strong>Procedural</strong>и отмечаем галочками плагины<strong>Procedural Content Generation Framework</strong>и <strong>Procedural Content Generation Framework Geometry Script Interop</strong>. После этого в меню создания блюпринтов появится процедурная генерация контента<strong>Граф PCG</strong>(PCGGraph) и<strong>Экземпляр Графа PCG</strong>(PCGGraph Instance).</p>
51
<p>Более подробную информацию о фреймворке процедурной генерации в Unreal Engine 5 и его применении можно узнать из <a>плейлиста</a>видеоуроков от программиста инструментов в Epic Games Адриена Логута.</p>
51
<p>Более подробную информацию о фреймворке процедурной генерации в Unreal Engine 5 и его применении можно узнать из <a>плейлиста</a>видеоуроков от программиста инструментов в Epic Games Адриена Логута.</p>
52
<p>Используя блюпринт<strong>PCG</strong>, Арран создал процедурную генерацию той самой ветви и применил полученную сетку на меш ствола с крупными ветвями. В итоге у него получилось полноценное дерево с динамической структурой. Направление ветвей с иголками можно задавать в реальном времени.</p>
52
<p>Используя блюпринт<strong>PCG</strong>, Арран создал процедурную генерацию той самой ветви и применил полученную сетку на меш ствола с крупными ветвями. В итоге у него получилось полноценное дерево с динамической структурой. Направление ветвей с иголками можно задавать в реальном времени.</p>
53
<em>Видео: Unreal Engine / YouTube</em><p>Ниже представлена структура графа текущей процедурной генерации ветвей, где за основу взята ветка в качестве<strong>Семплера сетки</strong>(Mesh Sampler) и создан нод<strong>Копировать точки</strong>(Copy Points). Точки наследуют свойства и атрибуты актора и меша. Также в графе настроены уровни детализации<strong>Distance to Density</strong>.</p>
53
<em>Видео: Unreal Engine / YouTube</em><p>Ниже представлена структура графа текущей процедурной генерации ветвей, где за основу взята ветка в качестве<strong>Семплера сетки</strong>(Mesh Sampler) и создан нод<strong>Копировать точки</strong>(Copy Points). Точки наследуют свойства и атрибуты актора и меша. Также в графе настроены уровни детализации<strong>Distance to Density</strong>.</p>
54
<em>Видео: Unreal Engine / YouTube</em><p>К слову, экспериментируя со связками нодов<strong>Distance to Density</strong>,<strong>Фильтр атрибута</strong>(Attribute Filter) и <strong>Генератор статичной сетки</strong>(Static Mesh Spawner) можно получить крону, в которой несколько ветвей будут без листьев, или вовсе изменить структуру кроны, тем самым добавив ассету больше вариативности.</p>
54
<em>Видео: Unreal Engine / YouTube</em><p>К слову, экспериментируя со связками нодов<strong>Distance to Density</strong>,<strong>Фильтр атрибута</strong>(Attribute Filter) и <strong>Генератор статичной сетки</strong>(Static Mesh Spawner) можно получить крону, в которой несколько ветвей будут без листьев, или вовсе изменить структуру кроны, тем самым добавив ассету больше вариативности.</p>
55
<em>Видео: Unreal Engine / YouTube</em><p>Преимущество этого подхода в том, что ассет состоит из отдельных компонентов, и каждый из них весит очень мало. Например, общий объём компонентов для текущего дерева из примера, по словам Аррана, составляет 1,6 МБ.</p>
55
<em>Видео: Unreal Engine / YouTube</em><p>Преимущество этого подхода в том, что ассет состоит из отдельных компонентов, и каждый из них весит очень мало. Например, общий объём компонентов для текущего дерева из примера, по словам Аррана, составляет 1,6 МБ.</p>
56
<p>Фреймворк<strong>PCG</strong>позволяет преобразовывать группы мешей в процедурный контент. Арран заранее подготовил уровень, где разместил готовое дерево. В <strong>Каталоге ресурсов</strong>(Content Browser) он кликнул<strong>ПКМ</strong>по файлу с уровнем, перешёл во вкладку<strong>Прописанные действия ресурса</strong>(Scripted Asset Actions) и выбрал<strong>PCG - Level to PCG Settings</strong>.</p>
56
<p>Фреймворк<strong>PCG</strong>позволяет преобразовывать группы мешей в процедурный контент. Арран заранее подготовил уровень, где разместил готовое дерево. В <strong>Каталоге ресурсов</strong>(Content Browser) он кликнул<strong>ПКМ</strong>по файлу с уровнем, перешёл во вкладку<strong>Прописанные действия ресурса</strong>(Scripted Asset Actions) и выбрал<strong>PCG - Level to PCG Settings</strong>.</p>
57
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>В результате дерево из уровня преобразовалось в данные с сохранением позиции, самого меша и его материалов. Все эти данные сохраняются в блюпринт, который можно добавить в новый блюпринт<strong>PCG</strong>, а затем с помощью построения графа - сгенерировать множество деревьев по всему ландшафту.</p>
57
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>В результате дерево из уровня преобразовалось в данные с сохранением позиции, самого меша и его материалов. Все эти данные сохраняются в блюпринт, который можно добавить в новый блюпринт<strong>PCG</strong>, а затем с помощью построения графа - сгенерировать множество деревьев по всему ландшафту.</p>
58
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>В видео ниже можно увидеть как выглядит блюпринт<strong>PCG</strong>для текущего лесного массива.</p>
58
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>В видео ниже можно увидеть как выглядит блюпринт<strong>PCG</strong>для текущего лесного массива.</p>
59
<em>Видео: Unreal Engine / YouTube</em><p>Нод<strong>TreeInstanceDemo</strong> - настройки PCG с деревом, которое создал Арран. Связка<strong>Получить данные ландшафта</strong>(Get Landscapes Data) -<strong>Семплер поверхности</strong>(Surface Sampler) -<strong>Точки преобразования</strong>(Transform Points) отвечает за образец ландшафта для создания нескольких точек генерации в мире. Затем художник объединил нод<strong>TreeInstanceDemo</strong>и эту связку в ноде<strong>Копировать точки</strong>(Copy Points), чтобы создать копии точек по всему миру. Далее Арран связал нод<strong>Копировать точки</strong>(Copy Points) с <strong>Фильтром атрибута</strong>(Attribute Filter), чтобы отделить контент, который не требуется в данной сцене.</p>
59
<em>Видео: Unreal Engine / YouTube</em><p>Нод<strong>TreeInstanceDemo</strong> - настройки PCG с деревом, которое создал Арран. Связка<strong>Получить данные ландшафта</strong>(Get Landscapes Data) -<strong>Семплер поверхности</strong>(Surface Sampler) -<strong>Точки преобразования</strong>(Transform Points) отвечает за образец ландшафта для создания нескольких точек генерации в мире. Затем художник объединил нод<strong>TreeInstanceDemo</strong>и эту связку в ноде<strong>Копировать точки</strong>(Copy Points), чтобы создать копии точек по всему миру. Далее Арран связал нод<strong>Копировать точки</strong>(Copy Points) с <strong>Фильтром атрибута</strong>(Attribute Filter), чтобы отделить контент, который не требуется в данной сцене.</p>
60
<p>С помощью этой техники можно получить плотный лесной массив деревьев с высокой детализацией, задействуя минимальные затраты ресурсов. Недостаток в том, что при таком подходе можно достигнуть лимита экземпляров, то есть инстансов - зависимых копий меша (в данном случае дерева).</p>
60
<p>С помощью этой техники можно получить плотный лесной массив деревьев с высокой детализацией, задействуя минимальные затраты ресурсов. Недостаток в том, что при таком подходе можно достигнуть лимита экземпляров, то есть инстансов - зависимых копий меша (в данном случае дерева).</p>
61
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>На кадре выше заметно, что на большом расстоянии листва исчезает. Конкретно в этом примере Арран вручную уменьшил расстояние отображения веток с целью продемонстрировать ещё одну технику - использование плоскостей-билбордов.</p>
61
<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>На кадре выше заметно, что на большом расстоянии листва исчезает. Конкретно в этом примере Арран вручную уменьшил расстояние отображения веток с целью продемонстрировать ещё одну технику - использование плоскостей-билбордов.</p>
62
<p>Чтобы снизить нагрузку на обработку мешей дальнего плана, можно заменить трёхмерный ассет простой плоскостью-билбордом, добавив его в иерархию уровней детализации.</p>
62
<p>Чтобы снизить нагрузку на обработку мешей дальнего плана, можно заменить трёхмерный ассет простой плоскостью-билбордом, добавив его в иерархию уровней детализации.</p>
63
В центре сцены - тот самый билборд-ассет<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Для такой оптимизации необходимо применить функцию<a><strong>World Partition</strong></a>и разграничить обработку данных, подключив подгрузку билборд-ассетов. Открываем раздел<strong>Параметры мира</strong>(World Settings), ставим галочку напротив пункта<strong>Включить подгрузку</strong>(Enable Streaming), если она не проставлена. Во вкладке<strong>Runtime Settings</strong> -<strong>Runtime Partitions</strong>находим<strong>Default HLOD Layer</strong>. Далее в разделе<strong>HLOD</strong>в пункте<strong>Layer Type</strong>выбираем<strong>Instancing</strong>(чтобы движок продолжал генерировать экземпляры). И ставим галочку напротив<strong>Запретить Nanite</strong>(Disallow Nanite).</p>
63
В центре сцены - тот самый билборд-ассет<em>Кадр:<a>Unreal Engine</a>/ YouTube</em><p>Для такой оптимизации необходимо применить функцию<a><strong>World Partition</strong></a>и разграничить обработку данных, подключив подгрузку билборд-ассетов. Открываем раздел<strong>Параметры мира</strong>(World Settings), ставим галочку напротив пункта<strong>Включить подгрузку</strong>(Enable Streaming), если она не проставлена. Во вкладке<strong>Runtime Settings</strong> -<strong>Runtime Partitions</strong>находим<strong>Default HLOD Layer</strong>. Далее в разделе<strong>HLOD</strong>в пункте<strong>Layer Type</strong>выбираем<strong>Instancing</strong>(чтобы движок продолжал генерировать экземпляры). И ставим галочку напротив<strong>Запретить Nanite</strong>(Disallow Nanite).</p>
64
<em>Видео: Unreal Engine / YouTube</em><p>Теперь при запуске симуляции (кнопка<strong>Play</strong>с зелёной стрелкой) на дальнем плане вместо голых деревьев появятся билборд-ассеты, которые издалека смотрятся довольно органично. Подобная комбинация упростит оптимизацию, так как движку не нужно рендерить меши деревьев на дальнем плане и тратить на них лишние ресурсы.</p>
64
<em>Видео: Unreal Engine / YouTube</em><p>Теперь при запуске симуляции (кнопка<strong>Play</strong>с зелёной стрелкой) на дальнем плане вместо голых деревьев появятся билборд-ассеты, которые издалека смотрятся довольно органично. Подобная комбинация упростит оптимизацию, так как движку не нужно рендерить меши деревьев на дальнем плане и тратить на них лишние ресурсы.</p>
65
<em>Видео: Unreal Engine / YouTube</em><p>Столь необычный подход позволяет оптимизировать рендеринг одного из самых ресурсозатратных типов ассетов, сохраняя при этом высокое качество картинки. Некоторые пользователи относятся к способу довольно критически, и их реакцию можно понять: комбинация билборд-ассетов с технологией Nanite, которая должна в теории исключить уровни детализации, кажется странным. Но в настоящий момент техника, предложенная Арраном, считается самой эффективной в контексте оптимизации детализированного лесного массива в движке.</p>
65
<em>Видео: Unreal Engine / YouTube</em><p>Столь необычный подход позволяет оптимизировать рендеринг одного из самых ресурсозатратных типов ассетов, сохраняя при этом высокое качество картинки. Некоторые пользователи относятся к способу довольно критически, и их реакцию можно понять: комбинация билборд-ассетов с технологией Nanite, которая должна в теории исключить уровни детализации, кажется странным. Но в настоящий момент техника, предложенная Арраном, считается самой эффективной в контексте оптимизации детализированного лесного массива в движке.</p>
66
<p>И не стоит забывать, что Epic Games строит большие планы на развитие Nanite, а значит, в будущих обновлениях стоит ожидать другие решения как в отношении оптимизации растений, так и для применения самой технологии в целом.</p>
66
<p>И не стоит забывать, что Epic Games строит большие планы на развитие Nanite, а значит, в будущих обновлениях стоит ожидать другие решения как в отношении оптимизации растений, так и для применения самой технологии в целом.</p>
67
<a><p>Профессия 3D-дженералист</p>
67
<a><p>Профессия 3D-дженералист</p>
68
<p>Вы станете универсальным специалистом, который умеет в 3D всё: создавать объекты и окружение, настраивать текстуры и цвет, анимировать модели и внедрять их в 3D-сцену.</p>
68
<p>Вы станете универсальным специалистом, который умеет в 3D всё: создавать объекты и окружение, настраивать текстуры и цвет, анимировать модели и внедрять их в 3D-сцену.</p>
69
<p>Освоите Houdini, Autodesk Maya, Blender, Photoshop, ZBrush, Marmoset 3D, Substance Painter, Marvelous Designer, Arnold и Rizom UV. Сможете претендовать на работу в рекламе, играх или кино.</p>
69
<p>Освоите Houdini, Autodesk Maya, Blender, Photoshop, ZBrush, Marmoset 3D, Substance Painter, Marvelous Designer, Arnold и Rizom UV. Сможете претендовать на работу в рекламе, играх или кино.</p>
70
<p><em>На иллюстрации: работа участника курса Евгения Кузнецова</em></p>
70
<p><em>На иллюстрации: работа участника курса Евгения Кузнецова</em></p>
71
<p>Узнать про курс</p>
71
<p>Узнать про курс</p>
72
</a><a><b>Кто вы в мире геймдева? Узнайте на бесплатном курсе ➞</b>Вы на практике попробуете 3 профессии: геймдизайнера, 2D-художника и разработчика на Unity. Создадите свою первую игру в стиле Mario. Узнать больше</a>
72
</a><a><b>Кто вы в мире геймдева? Узнайте на бесплатном курсе ➞</b>Вы на практике попробуете 3 профессии: геймдизайнера, 2D-художника и разработчика на Unity. Создадите свою первую игру в стиле Mario. Узнать больше</a>