Уровень детализации сетки (LOD)

Уровень детализации (LOD) — один из важнейших способов оптимизации производительности рендеринга в 3D-проектах наряду с Отбраковка окклюзии.

В этом руководстве вы узнаете:

  • Как LOD сетки может улучшить производительность рендеринга вашего 3D-проекта.

  • Как настроить LOD сетки в Godot.

  • Как измерить эффективность LOD сетки в вашем проекте (и какие альтернативы можно изучить, если он не оправдает ожиданий).

См. также

Вы можете увидеть, как работает LOD сетки, в действии с помощью демо-проекта Occlusion Culling and Mesh LOD.

Введение

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

Однако в проектах с большим количеством детализированных 3D-ассетов ручная настройка LOD может быть очень трудоёмким процессом. В результате автоматическое упрощение сеток и настройка LOD становятся всё более популярными.

Godot предоставляет возможность автоматически генерировать менее детализированные сетки для использования в LOD при импорте, а затем автоматически использовать эти LOD-сетки при необходимости. Это полностью прозрачно для пользователя. За кулисами для генерации LOD-сеток используется библиотека meshoptimizer.

LOD сетки работает с любым узлом, отображающим 3D-сетки. Это включает MeshInstance3D, MultiMeshInstance3D, GPUParticles3D и CPUParticles3D.

Визуальное сравнение

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

От самого детализированного (слева) до наименее детализированного (справа), затенённый вид

От самого детализированного (слева) до наименее детализированного (справа), затенённый вид

Вот то же изображение с рендерингом в каркасном режиме, чтобы упрощение было лучше видно:

От самого детализированного (слева) до наименее детализированного (справа), каркасный вид

От самого детализированного (слева) до наименее детализированного (справа), каркасный вид

См. также

Если вам нужно вручную настроить уровень детализации с помощью сеток, созданных художником, используйте Диапазоны видимости (HLOD) вместо автоматического LOD сетки.

Генерация LOD сетки

По умолчанию генерация LOD сетки происходит автоматически для импортированных 3D-сцен (glTF, .blend, Collada, FBX). После генерации LOD-сеток они будут автоматически использоваться при рендеринге сцены. Вам не нужно ничего настраивать вручную.

Однако генерация LOD сетки не происходит автоматически для импортированных 3D-сеток (OBJ). Это связано с тем, что файлы OBJ по умолчанию импортируются не как полноценные 3D-сцены, а только как отдельные ресурсы сеток для загрузки в узел MeshInstance3D (или GPUParticles3D, CPUParticles3D, ...).

Чтобы для файла OBJ была сгенерирована LOD сетка, выберите его в доке FileSystem, перейдите в док Import, измените опцию Import As на Scene, затем нажмите Reimport:

Изменение типа импорта для файла OBJ в доке Import

Изменение типа импорта для файла OBJ в доке Import

После нажатия Reimport потребуется перезапустить редактор.

Примечание

Процесс генерации LOD сетки не идеален и может иногда вызывать проблемы с рендерингом (особенно в скиннированных сетках). Генерация LOD сетки также может занимать некоторое время для сложных сеток.

Если LOD сетки приводит к некорректному виду конкретной сетки, вы можете отключить генерацию LOD для неё в доке Import. Это также ускорит импорт ресурсов. Это можно сделать глобально в настройках импорта 3D-сцены или для каждой сетки отдельно с помощью диалога Advanced Import Settings.

См. Импорт 3D-сцен для получения дополнительной информации.

Сравнение визуального качества и производительности LOD сетки

Чтобы отключить LOD сетки в редакторе для сравнения, используйте расширенный режим отладки Disable Mesh LOD. Это можно сделать с помощью меню в левом верхнем углу 3D-вьюпорта (помеченного как Perspective или Orthogonal в зависимости от режима камеры):

Отключение LOD сетки в меню 3D-вьюпорта

Отключение LOD сетки в меню 3D-вьюпорта

Включите View Frame Time в том же меню, чтобы видеть FPS в правом верхнем углу. Также включите View Information в том же меню, чтобы видеть количество примитивов (вершины + индексы), отображаемых в правом нижнем углу.

Если LOD сетки работает корректно в вашей сцене и камера находится достаточно далеко от сетки, вы должны заметить уменьшение количества отображаемых примитивов и увеличение FPS, когда LOD сетки включён (если у вас нет узкого места в CPU).

Чтобы увидеть упрощение LOD сетки в действии, измените режим отладки на Display Wireframe в указанном выше меню, затем отрегулируйте настройку проекта Rendering > Mesh LOD > LOD Change > Threshold Pixels.

Настройка производительности и качества LOD сетки

Вы можете настроить агрессивность переходов LOD для мешей в корневом вьюпорте, изменив настройку проекта Rendering > Mesh LOD > LOD Change > Threshold Pixels. Чтобы изменить это значение во время выполнения, установите свойство mesh_lod_threshold для корневого вьюпорта следующим образом:

get_tree().root.mesh_lod_threshold = 4.0

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

Порог LOD для мешей по умолчанию (1 пиксель) настроен для визуально незаметной потери качества; это даёт значительный прирост производительности без видимого ухудшения качества. Более высокие значения заставят переходы LOD происходить раньше при удалении камеры, что повысит производительность, но снизит качество.

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

Кроме того, узлы ReflectionProbe имеют собственное свойство Mesh LOD Threshold, которое можно настроить для повышения производительности рендеринга при обновлении зонда отражений. Это особенно важно для ReflectionProbe в режиме обновления Always.

Примечание

При рендеринге сцены выбор уровня LOD для мешей использует экранную метрику. Это означает автоматический учёт поля зрения камеры и разрешения вьюпорта. Более широкое поле зрения (FOV) и низкое разрешение вьюпорта сделают выбор LOD более агрессивным; движок будет отображать сильно упрощённые модели раньше при удалении камеры.

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

Использование LOD для мешей с MultiMesh и частицами

Для выбора LOD используется точка AABB узла, ближайшая к камере. Это применимо ко всем видам LOD для мешей (включая отдельные MeshInstance3D), но имеет последствия для узлов, отображающих несколько мешей одновременно (MultiMeshInstance3D, GPUParticles3D). Главное — все экземпляры будут отрисовываться с одним уровнем LOD в любой момент времени.

Если вы наблюдаете некорректный выбор LOD для GPUParticles3D, убедитесь, что настроен AABB видимости узла: выберите узел GPUParticles3D и используйте GPUParticles3D > Generate AABB в верхней части 3D-вьюпорта.

Если экземпляры в MultiMesh находятся далеко друг от друга, их следует разместить в отдельных узлах MultiMeshInstance3D. Это также улучшит производительность рендеринга, так как отсечение по пирамиде видимости (frustum) и окклюзии сможет отсекать отдельные узлы (чего нельзя сделать с отдельными экземплярами внутри MultiMesh).