Концепты от AI #concept@cgitems
Что такое лоды и лодирование в играх. Как настроить лоды. LODs

Во-первых, давайте расшифруем само слово LODLevel of Detail — то есть уровень детализации. Лодирование — процесс создания нескольких уровней детализации для одного объекта в сцене, чтобы сэкономить ресурсы системы на прорисовку тех моделей, которые находятся далеко от виртуальной камеры (то есть взгляда игрока).

01_LODs_CGItems.ru.jpg

Представьте, что вы включили игру с открытым миром, например Киберпанк 2077. Теперь вы подходите близко к какому-нибудь зданию и можете рассмотреть его в мельчайших деталях. Если же вы будете постепенно отдаляться от него, то заметите что детали пропадают и, если вы удалитесь достаточно далеко, то от здания останется один силуэт с горящими в ночи квадратиками окон. Именно для этого и нужны лоды — чтобы не перегружать систему прорисовкой тех деталей, которых попросту будет невозможно рассмотреть. А это значит уменьшить количество Draw Calls.

02_LODs_CGItems.ru.jpg

Сам алгоритм лодов был описан еще в 1976 году в одной из статей Джеймса Кларка (разработчик программного обеспечения, основатель нескольких успешных компаний в Силиконовой Долине). Компьютерные технологии тогда были еще совсем на заре своего развития, но уже тогда высказывалась идея о «…структурировании рендера пространств» с использованием более быстрых трансформаций и операций обрезки. С тех пор технология распространилась и в разработке игр, став очень важным инструментом для оптимизации игр с открытым миром и не только.

03_LODs_CGItems.ru.jpg Игра от CD Project Red, Cyberpunk 2077 (2020) Нашумела своими багами после релиза. Игроки много жаловались из-за внезапной смены лодов (Popping), особенно во время езды на транспорте.

Типы LODs в играх

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

Лодирование геометрии моделей

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

Создание лодов вручную

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

Вот несколько советов как уменьшить модель:

  • Удалить мелкие детали, их в первую очередь перестанет быть видно на расстоянии
  • Сократить количество полигонов на больших плоскостях. В этом может помочь инструмент Weld, который присутствует в большинстве 3D редакторов
  • Размапить более простую форму на оригинальную. Долгий процесс, который пойдет если больше ничего не помогает
04_LODs_CGItems.ru.jpg На уменьшение геометрии в следующем лоде обычно рекомендуют придерживаться среднего значения в 50%, но в зависимости от конкретной задачи это значение, очевидно, может меняться. Также не следует создавать лоды для объектов, которые нельзя урезать хотя бы на 30%.

При выгрузке в движок лоды обычно принято именовать начиная с LOD0, затем LOD1, LOD2 и далее по возрастанию. Самым детализированным будет меш LOD0 и каждый следующий лод будет содержать меньше полигонов, чем предыдущий. Почти все современные игровые движки поддерживают функцию лодирования и ближе к концу статьи вы найдете небольшой туториал о том, как правильно настроить лоды в Unreal Engine и Unity.

05_LODs_CGItems.ru.jpg

Использование специальных программ

Если вам лень делать все вручную, можно использовать программы специально предназначенные для создания лодов — Simplygon, Unity Mesh Simplifier, Ultimate LOD System MT, Mantis LOD Editor, Pixyz, InstaLOD. Некоторые из них даже поддерживают интеграцию в движки.

06_LODs_CGItems.ru.jpg

Лодирование для текстур. Mip-Mapping

Лоды для текстур создавать и того проще — каждый следующий лод текстуры должен быть меньше предыдущей в два раза. Так если LOD0 - 1024x1024px, то LOD1512x521px и так далее. Это необходимо, чтобы текстуры не мерцали при отдалении из-за изменения ракурса камеры. При отключенной оптимизации видеокарте приходится каждый раз выбирать, какой тексель будет использоваться для расчета точки.

Кстати, MIP расшифровывается как Multum In Parvo и переводится с латыни как «многое в малом». Поздравляю, теперь вы можете умничать в компании тридешников! 07_LODs_CGItems.ru.jpg Справа тексутра не оптимизированна и рябит. Слева применяется мипмаппинг, создается плавный переход.

Принцип работы лодов в движках

Обычно движки используют систему триггеров и порогов которые определяют в какой момент один лод сменится на другой. Такие триггеры могут зависеть от разных факторов, например, от расстояния от камеры, угла обзора, объема который занимает меш на экране или от уровня освещения. Так LOD1 может быть настроен на срабатывание на расстоянии 50 метров от камеры, а LOD2 уже на 100 метрах.

08_LODs_CGItems.ru.jpg

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

Вместо последнего лода, когда объект находится предельно далеко от камеры, может использоваться Occlusion Culling - движок просто не будет рендерить модель, когда объект уже скрылся из поля зрения игрока.

А иногда модель может стать простым плейном — по сути 2d картинкой, развернутой в сторону игрока. Такие лоды называют билбордами (Billboard).

09_LODs_CGItems.ru.jpg

В целом для одной модели достаточно 2-4 лодов. Слишком большое количество лодов приведет к избыточной нагрузке на оперативную память и к долгому времени загрузки.

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

Лоды рекомендуют создавать для следующих типов объектов:

  • Модели с большим количеством детализации, которой не будет видно на расстоянии
  • Округлые предметы и органика, на них меньше заметно сокращение геометрии
  • Объекты, использующие «дорогие» шейдеры (например, отражающие материалы)
10_LODs_CGItems.ru.jpg Игра Сrash Bandicoot: Warped (1998) Здесь лоды использовались для создания далеких замков и холмов на фоне, в уровнях в средневековом сеттинге.

Лоды по способу работы в программах

Discrete Levels of Detail (DLOD)

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

Continuous Level of Detail (CLOD)

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

11_LODs_CGItems.ru.gif

В современных играх обычно используют комбинацию различных техник лодирования: несколько лодов для больших моделей и occlusion culling для небольших элементов окружения таких например как трава и деревья. Лоды можно настроить даже для тиррейна. А новая система Nanite от Unreal Engine 5 встроила систему лодов прямо внутрь меша, вместо объекта как целого.

Туториал по настройке LODs в Unreal Engine

Unreal Engine поддерживает как автоматическую генерацию лодов, так и загрузку лодов, созданных вручную.

Порядок действий для добавления лодов, созданных вручную:

  1. Выбираем меш в Content Browser и делаем двойной клик по нему.
  2. Ищем LOD Settings в разделе Details.
  3. 12_LODs_CGItems.ru.jpg
  4. Находим LOD Import и открываем окно рядом с надписью LOD 0 и кликаем на выпадающем Import LOD Level
  5. Далее выбираем нужный файл в проводнике. (После добавления лода его можно заменить в любой момент в той же вкладке. Надпись просто изменится на Reimport LOD Level 1).
  6. 13_LODs_CGItems.ru.jpg
  7. Добавляем необходимое кол-во лодов, в том же выпадающем списке.
  8. По умолчанию Unreal сам рассчитывает среднее значение дистанции для переключения лодов. Но если вы хотите настроить конкретные значение уберите галку с вкладки Auto Compute LOD Distances. Далее настройте значение Screen Size во вкладке каждого лода. Лод переключается, когда меш начинает занимать определенный процент экрана. (Например, если у вас есть два лода, то по умолчанию второй будет включатся когда модель станет занимать менее 50% процентов экрана).
  9. 14_LODs_CGItems.ru.jpg
  10. Также к каждому лоду можно добавить уникальную текстуру во вкладке Sections. Еще не забыли про мипмаппинг?
15_LODs_CGItems.ru.jpg

Вы великолепны! Надеемся, у вас получилось добавить лоды для своей модели.

16_LODs_CGItems.ru.jpg НО! Важно иметь в виду, что лоды зависят именно от их размера на экране. Так если вы поставите два инстанса одной модели рядом, а один из них увеличите в размере, меньший объект переключится быстрее, не смотря на то, что они находятся на одном и том же расстоянии от камеры. А еще переключение лодов зависит и от размеров самого вьюпорта.

Автоматическое лодирование

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

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

LOD Group

Этим вариантом советуют пользоваться сами эпики, но для него возможно придется немного залезть в код. Перед работой с проектом требуется найти файл BaseEngine.ini по пути расположения игрового движка (Epic Games\UE_5.3.1\Engine\Config), открыть его в текстовом редакторе и проверить наличие раздела [StaticMeshLODSettings].

[StaticMeshLODSettings] LevelArchitecture=(NumLODs=4,LightMapResolution=32,LODPercentTriangles=50,PixelError=12,SilhouetteImportance=4,Name=LOCTEXT("LevelArchitectureLOD","Level Architecture")) SmallProp=(NumLODs=4,LODPercentTriangles=50,PixelError=10,Name=LOCTEXT("SmallPropLOD","Small Prop")) LargeProp=(NumLODs=4,LODPercentTriangles=50,PixelError=10,Name=LOCTEXT("LargePropLOD","Large Prop")) Deco=(NumLODs=4,LODPercentTriangles=50,PixelError=10,Name=LOCTEXT("DecoLOD","Deco")) Vista=(NumLODs=1,Name=LOCTEXT("VistaLOD","Vista")) Foliage=(NumLODs=1,Name=LOCTEXT("FoliageLOD","Foliage")) HighDetail=(NumLODs=6,LODPercentTriangles=50,PixelError=6,Name=LOCTEXT("HighDetailLOD","High Detail"))

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

Но не спешите! По сути эти параметры вы можете выбрать в выпадающем меню вкладки LOD Groups в Mesh Editor и вам может быть даже не придется лазать и добавлять изменения (только если вас что-то не устроило в установленных значениях).

17_LODs_CGItems.ru.jpg

Стандартным выбором среди этих пресетов обычно становится Small Prop. При выборе настройки Unreal спросит вас действительно ли вы хотите изменить текущие настройки лодов. Отвечаем ДА.

18_LODs_CGItems.ru.jpg

Интерфейс изменится на следующий.

19_LODs_CGItems.ru.jpg

Галка на Auto Compute LOD Distances должна быть включена. Поэкспериментируйте и найдите тот вариант настроек, который устроит вас больше всего.

20_LODs_CGItems.ru.jpg

Ручная настройка

Разработчики Unreal рекомендуют пользоваться LOD Groups, так как они применяются одновременно ко всем лодам, но нам все равно нужно узнать все способы настройки!

  1. В тех же Details в Mesh Editor находим вкладку Number of LODs. Меняем значение на необходимое и жмем кнопку Apply Changes.
  2. 21_LODs_CGItems.ru.jpg
  3. Галка на Auto Compute LOD Distances также должна быть включена.
  4. Заходим в LOD1, ищем и раскрываем вкладку Reduction Settings
  5. 22_LODs_CGItems.ru.jpg
  6. Находим значение Percent Triangles (процент треугольников) и устанавливаем значение 75, а затем нажмимаем Apply Changes. Устанавливаем значение 25 и 12 на следующие лоды.
  7. 23_LODs_CGItems.ru.jpg
  8. После компиляции напротив вкладки каждого лода вы увидите сгенерированное количество треугольников и вертексов.
24_LODs_CGItems.ru.jpg

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

25_LODs_CGItems.ru.jpg Проект от Epic Games, Unreal Tournament (1999) Тут лоды используются для оптимизации персонажей.

Как загрузить LODs в Unity

  1. Добавьте компонент LODGroup на пустой родительский объект через AddComponent. В первую очередь вы увидите полоску с именованием лодов сверху. Лод Culled означает, что модель не будет рендерится вовсе.
  2. 26_LODs_CGItems.ru.jpg
  3. Количеством лодов можно управлять, нажав ПКМ на полоске и выбрав Insert Before или Delete. Процент на этой полоске означает дальность, на которой данный LOD-уровень становится активным, а сам лод зависит от размера объекта на экране как и в Unreal Engine. Вы можете изменить значение процентов перетащив одну из вертикальных линий, разделяющих полоску.
  4. Чтобы загрузить ваши лоды кликните на LOD-полоске по соответствующей иконке. Появится панель Renderers. Щелкните на пустом квадрате и выберете нужный дочерний объект. (Перед этим их нужно добавить в проект к родительскому).
  5. 27_LODs_CGItems.ru.jpg
  6. Вы также можете настроить Fade Mode для каждого лода. Это функция плавного бленда при переходе от одного лода к другому. Выберете во вкладке Cross Fade и настройте значение плавности перехода.
  7. Автоматическая генерация не предусмотрена в версии из коробки, но на просторах интернета вы с легкостью сможете найти дополнительные инструменты для этой задачи. Добавить их можно через вкладку WindowPackage Manager — затем нажать на плюс в открывшемся окне и выбрать файл при помощи одного из подходящих способов.
28_LODs_CGItems.ru.jpg The Serious Sam (2001) Разработчики решили создать огромное открытое пространство (более километра) и поставили задачу рендера более 100 врагов на экране за раз.

Надеемся вы нашли эту информацию полезной! Добавляйте статью к себе в закладки, чтобы не потерять.

29_LODs_CGItems.ru.jpg
Ваша заявка отправлена!
Если во входящих на почте: нет письма, проверьте папку спам или напишите нам в телеграм