Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Рівень деталізації сітки (LOD)
Рівень деталізації (LOD) є одним із найважливіших способів оптимізації продуктивності візуалізації в 3D-проекті разом із Вибракування оклюзії.
На цій сторінці ви дізнаєтеся:
Як сітчастий LOD може покращити продуктивність візуалізації вашого 3D-проекту.
Як налаштувати меш LOD у Godot.
Як виміряти ефективність меша LOD у вашому проекті (і альтернативи, які ви можете дослідити, якщо він не відповідає вашим очікуванням).
Дивись також
Ви можете побачити, як працює mesh LOD, використовуючи демонстраційний проект Occlusion Culling and Mesh LOD <https://github.com/godotengine/godot-demo-projects/tree/master/3d/occlusion_culling_mesh_lod>`__.
Вступ
Історично склалося так, що рівень деталізації в 3D-іграх передбачав ручне створення сіток із меншою щільністю геометрії, а потім налаштування порогових значень відстані, на яких ці сітки з меншою деталізацією повинні бути намальовані. Цей підхід використовується й сьогодні, коли потрібен посилений контроль.
Однак у проектах, які мають велику кількість детальних 3D-активів, налаштування LOD вручну може бути дуже трудомістким процесом. У результаті автоматичне проріджування сітки та конфігурація LOD стають все більш популярними.
Godot надає можливість автоматично генерувати менш деталізовані сітки для використання LOD під час імпорту, а потім автоматично використовувати ці сітки LOD, коли потрібно. Це абсолютно прозоро для користувача. Бібліотека meshoptimizer використовується для створення сітки LOD за кадром.
Mesh 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, перейдіть до док-станції «Імпорт», змініть параметр Імпортувати як на Сцена, а потім натисніть Повторно імпортувати:
Зміна типу імпорту для файлу OBJ у доку Імпорт
Для цього потрібно буде перезапустити редактор після натискання Повторно імпортувати.
Примітка
Процес генерації LOD сітки не є досконалим і іноді може викликати проблеми з рендерингом (особливо в шкірних сітках). Створення LOD сітки також може зайняти деякий час на складних сітках.
Якщо LOD сітки призводить до того, що певна сітка виглядає зламаною, ви можете вимкнути генерацію LOD для неї в доці Імпорт. Це також прискорить імпорт ресурсів. Це можна зробити глобально в параметрах імпорту 3D-сцени або на основі кожної сітки за допомогою діалогового вікна «Додаткові параметри імпорту».
Перегляньте Importing 3D scenes для отримання додаткової інформації.
Порівняння візуальних ефектів і продуктивності mesh LOD
Щоб вимкнути LOD сітки в редакторі для цілей порівняння, скористайтеся розширеним режимом малювання налагодження Вимкнути LOD сітки. Це можна зробити за допомогою меню у верхньому лівому куті тривимірного вікна перегляду (з позначкою Перспектива або Ортогонально залежно від режиму камери):
Вимкнення LOD сітки у верхньому лівому меню вікна 3D
Увімкніть Переглянути час кадру у тому ж меню, щоб переглянути FPS у верхньому правому куті. Також увімкніть Переглянути інформацію у цьому ж меню, щоб переглянути кількість примітивів (вершини + індекси), відображених у нижньому правому куті.
Якщо mesh LOD працює належним чином у вашій сцені, а ваша камера знаходиться достатньо далеко від сітки, ви повинні помітити, що кількість намальованих примітивів зменшується, а FPS збільшується, коли mesh LOD залишається ввімкненим (якщо у вас немає вузьких місць у процесорі).
Щоб побачити децимацію LOD сітки в дії, змініть режим малювання налагодження на Display Wireframe у зазначеному вище меню, а потім налаштуйте параметр проекту Rendering > Mesh LOD > LOD Change > Threshold Pixels.
Налаштування продуктивності та якості mesh LOD
Ви можете налаштувати, наскільки агресивними повинні бути переходи LOD сітки в кореневому вікні перегляду, змінивши параметр проекту Rendering > Mesh LOD > LOD Change > Threshold Pixels. Щоб змінити це значення під час виконання, встановіть mesh_lod_threshold на кореневому вікні перегляду наступним чином:
get_tree().root.mesh_lod_threshold = 4.0
GetTree().Root.MeshLodThreshold = 4.0f;
Кожне вікно перегляду має власну властивість mesh_lod_threshold, яку можна встановити незалежно від інших вікон перегляду.
Порогове значення LOD сітки за замовчуванням у 1 піксель налаштовано так, щоб виглядати перцепційно без втрат; це забезпечує значний приріст продуктивності з непомітною втратою якості. Вищі значення призведуть до того, що переходи LOD відбуватимуться раніше, коли камера віддалятиметься, що призведе до кращої продуктивності, але нижчої якості.
Якщо вам потрібно виконати коригування LOD для кожного об’єкта, ви можете налаштувати, наскільки агресивними повинні бути переходи LOD, налаштувавши властивість LOD Bias на будь-якому вузлі, який успадковує від GeometryInstance3D. Значення вище 1.0 призведуть до того, що переходи LOD відбуватимуться пізніше, ніж зазвичай (що призведе до вищої якості, але нижчої продуктивності). Значення нижче 1.0 призведуть до того, що переходи LOD відбуватимуться швидше, ніж зазвичай (що призведе до нижчої якості, але вищої продуктивності).
Крім того, вузли ReflectionProbe мають власну властивість Mesh LOD Threshold, яку можна налаштувати для покращення продуктивності візуалізації під час оновлення датчика відображення. Це особливо важливо для ReflectionProbes, які використовують режим оновлення Завжди.
Примітка
Під час візуалізації сцени виділення LOD сітки використовує метрику екранного простору. Це означає, що він автоматично враховує поле зору камери та роздільну здатність вікна перегляду. Вищий кут огляду камери та нижча роздільна здатність вікна перегляду зроблять вибір LOD більш агресивним; механізм відображатиме сильно знищені моделі раніше, коли камера відійде.
Як результат, на відміну від Діапазон видимості (HLOD), вам не потрібно робити нічого конкретного у вашому проекті, щоб врахувати поле зору камери та роздільну здатність вікна перегляду.
Використання сітки LOD з MultiMesh і частинками
Для вибору LOD точка вузла AABB, яка є найближчою до камери, використовується як основа. Це стосується будь-якого типу LOD сітки (зокрема для окремих MeshInstance3D), але це має деякі наслідки для вузлів, які відображають кілька сіток одночасно, наприклад MultiMeshInstance3D, GPUParticles3D і GPUParticles3D. Найважливіше те, що це означає, що всі екземпляри будуть намальовані з однаковим рівнем LOD у певний час.
Якщо ви помітили неправильний вибір LOD за допомогою GPUParticles3D, переконайтеся, що видимість вузла AABB налаштовано, вибравши вузол GPUParticles3D і скориставшись GPUParticles3D > Generate AABB у верхній частині вікна тривимірного перегляду.
Якщо у вас є екземпляри в MultiMesh, які знаходяться далеко один від одного, їх слід розмістити в окремому вузлі MultiMeshInstance3D. Це також покращить продуктивність візуалізації, оскільки відсікання усеченої та оклюзії зможе відсікати окремі вузли (у той час як вони не можуть відсікати окремі екземпляри в MultiMesh).