Запечені карти освітлення

Вступ

Запечені карти освітлення є альтернативним варіантом додавання непрямого (або повністю запеченого) освітлення до сцени. На відміну від підходу Користування Зонду Глобального Освітлення, запечені карти освітлення чудово працюють на низькокласних ПК та мобільних пристроях, оскільки вони майже не споживають ресурсів під час виконання. Також, на відміну від Глобальних зондів, запечені світлові карти, за бажання, можуть бути використані для зберігання прямого освітлення, що забезпечує ще більший приріст продуктивності.

На відміну від Глобальних Зондів Освітлення, запечені карти освітлення повністю статичні. Після запікання вони взагалі не можуть бути змінені. Вони також не надають сцені відображення, тому, для отримання хорошої якості, разом з ними використовують Зонди відображень в інтер'єрах (або Небо в екстер'єрах).

При запіканні з ними менше проблем, ніж з Глобальними зондами, і викривлення світла, та непряме світло, часто будуть виглядати краще. Недоліком є те, що запікання карт освітлення займає набагато більше часу, ніж запікання Глобальних зондів. У той час як запікання Глобального зонду може бути виконане за лічені секунди, запікання карти освітлення займе кілька хвилин, якщо не більше. Це може значно уповільнити швидкість ітерації, тому запікати карти освітлення рекомендується тільки тоді, коли справді потрібно побачити зміни в освітленні.

Запікання карт освітлення також резервує гніздо UV2 для запікання, а це означає, що ви більше не можете використовувати його для інших цілей у матеріалах (або у вбудованому просторовому матеріалі, або в спеціальних шейдерах).

Зрештою, рішення про те, який підхід до непрямого освітлення краще, залежить від вашого випадку використання. Загалом, Глобальні зонди легше налаштувати і вони краще працюють з динамічними об'єктами. Зате запечені карти освітлення успішно працюють на мобільних пристроях та слабеньких ПК.

Візуальне порівняння

Ось невелике порівняння того, як виглядає Запечена Карта Освітлення і Глобальний Зонд Освітлення. Запримітьте, що карти освітлення точніші, але також страждають від того, що освітлення знаходиться на розкрученій текстурі, тому переходи і роздільна здатність можуть бути не такими хорошими. Освітлення з глобальним зондом виглядає менш точним (оскільки воно наближене), але гладкішим в цілому.

../../_images/baked_light_comparison.png

Налаштування

Перш за все, перш ніж карта освітлення зможе зробити що-небудь, об'єкти, які будуть запікатися, потребують шару UV2 і розміру текстури. Шар UV2 - це набір вторинних координат текстури, який гарантує, що будь-яка лицьова сторона об'єкта має своє місце на UV-карті. Лицьові сторони не повинні ділитися пікселями в текстурі.

Є кілька способів переконатися, що ваш об'єкт має унікальний шар UV2 і розмір текстури:

Розгортка при імпорті сцени

Це, мабуть, найкращий підхід в цілому. Єдиним недоліком є те, що на великих моделях розгортання може зайняти деякий час при імпорті. Тим не менш, Godot буде кешувати UV2 при повторних імпортуваннях, тому це буде регенерувати тільки тоді, коли необхідно.

Виберіть імпортовану сцену на панелі Файлової системи, а потім перейдіть до панелі Імпорт. Там можна змінити наступні опції:

../../_images/baked_light_import.png

Режим Light Baking (Запікання світла) повинен бути встановлений на Gen Lightmaps (Отримати Карту освітлення).Також повинен бути передбачений розмір текселя в світових одиницях, так як це визначить остаточний розмір текстури карти освітлення (і, як наслідок, UV розгортання на карті).

Ефект налаштування цього параметра полягає в тому, що всі меші в межах сцени матимуть свої карти UV2 згенеровані належним чином.

Попередження

При повторному використанні меша в межах сцени майте на увазі, що всі UV будуть створені для першого знайденого екземпляра. Якщо меш повторно використовується з різними масштабами (і масштаби дико відрізняються, більш ніж наполовину, або в два рази), це призведе до неефективних карт освітлення. Не використовуйте вихідний меш в масштабах, що сильно відрізняються, якщо плануєте використовувати карти освітлення.

Крім того, файли *.unwrap_cache не слід ігнорувати в елементі керування версіями, оскільки ці файли гарантують, що повторні імпортування UV2 узгоджені на різних платформах і версіях рушія.

Розгортка всередині Godot

Godot має можливість розгорнути меші та візуалізувати UV канали. Їх можна знайти в меню Сітка:

../../_images/baked_light_mesh_menu.png

Це створить другий набір координат UV2, які можуть бути використані для запікання, а також автоматично встановить розмір текстури.

Розгортка в 3D застосунку

Останній варіант - зробити це з улюбленого 3D-застосунку. Цей підхід, як правило, не рекомендується, але він пояснюється, щоб ви знали, що він існує. Головною перевагою є те, що на складних об'єктах, які ви, можливо, забажаєте повторно імпортувати багато раз, процес генерації текстури може бути досить затратним у Godot, тому розгортка перед імпортом може виявитися швидшою.

Просто розгорніть розгортку на другому шарі UV2.

../../_images/baked_light_blender.png

Потім імпортуйте 3D-сцену в звичайному режимі. Пам'ятайте, що вам потрібно буде встановити розмір текстури на меші після імпорту.

../../_images/baked_light_lmsize.png

Якщо ви використовуєте зовнішні меші при імпорті, розмір буде збережено. Будьте обережні, бо більшість розгорток в 3D застосунках не орієнтовані на якість, оскільки вони призначені для швидкої роботи. Вам, в основному, потрібно буде використовувати шви, або інші методи, щоб створити краще розгортання.

Перевірка UV2

У, згаданому раніше меню меша Сітка, можна візуалізувати координати текстури UV2. Якщо щось не вдається, перевірте, чи меш має координати UV2:

../../_images/baked_light_uvchannel.png

Налаштування сцени

Перш ніж щось зробити, додайте до сцени вузол BakedLightmap (Запечена карта освітлення). Він дозволить легко запікати світло на всіх вузлах (і під-вузлах) в цій сцені, і навіть на вставлених екземплярах сцен.

../../_images/baked_light_scene.png

Можна вставити кілька екземплярів під-сцен, оскільки це підтримується запіканням, і кожному буде присвоєно власну карту освітлення (просто обов'язково дотримуйтесь правила про масштабування, згаданого раніше):

Налаштування межі

Карта освітлення потребує приблизного об'єму захопленої області, оскільки вона використовує її для передачі світла динамічним об'єктам всередині неї (про це пізніше). Просто загорніть сцену, як ви робите з Глобальним зондом освітлення:

../../_images/baked_light_bounds.png

Налаштування мешів (сіток)

Щоб вузол MeshInstance брав участь у процесі запікання, він повинен мати відмічену властивість Use in Baked Light (Використовувати в запіканні світла).

../../_images/baked_light_use.png

При автоматичному створенні карт освітлення, ця властивість активується автоматично.

Налаштування світла

За замовчуванням запікається непряме світло. Це означає, що тіні та освітлення все ще динамічні і залежні від рухомих об'єктів, а запікатися буде відбите світло.

Світло можна відключити (не запікати), або запекти повністю (пряме і непряме). Цим можна керувати з меню Bake Mode (Режим запікання) на світлі:

../../_images/baked_light_bake_mode.png

Основні режими:

Вимкнено

Світло ігнорується при запіканні карт освітлення. Майте на увазі, що приховування світла не матиме ніякого ефекту для запікання, тому, замість того, щоб приховувати світловий вузол, необхідно використовувати цей режим.

Цей режим використовується для динамічних світлових ефектів, таких як вибухи та спалахи зброї.

Непряме

Це режим за замовчуванням і компроміс між продуктивністю та дружелюбністю в режимі реального часу. Буде запікатися тільки непряме освітлення. Пряме світло і тіні залишаться в режимі реального часу, як це було б без BakedLightmap.

Цей режим дозволяє виконувати тонкі зміни кольору, енергії та положення світла, і при цьому зберігати досить коректний вигляд. Наприклад, ви можете використовувати його для створення мерехтливих статичних факелів, і запекти їх непряме світло.

Все

Буде запікатися як непряме, так і пряме освітлення. Оскільки обчислення освітлення та затінення статичних поверхонь можна повністю пропустити, цей режим забезпечує найкращу продуктивність і плавні тіні, які нікуди не зникають на відстані. Світло в режимі реального часу більше не впливає на запечені поверхні, але все одно впливає на динамічні об'єкти. При використанні режиму запікання світла All динамічні об'єкти не будуть відкидати тіні в режимі реального часу на запечені поверхні, тому вам потрібно потурбуватись про інший підхід, наприклад плями тіней. Плями тіней можна реалізувати з Sprite3D + RayCast, або негативним SpotLight (ОбмеженимТочковим Світлом), спрямованим вниз і виставленим режимом запікання Disabled.

Світло взагалі не буде регулюватися під час ігрового процесу. Переміщення світла і зміна його кольору, або енергії, не матиме ніякого впливу на статичні поверхні.

Оскільки режими запікання можна регулювати на основі на світла, можна створити гібридні параметри запікання світла. Одним з популярних варіантів є використання в режимі реального часу спрямованого світла DirectionalLight з встановленим його режимом запікання на Indirect (Непряме), і використання режиму запікання All на OmniLights і SpotLights. Це забезпечує хорошу продуктивність, дозволяючи динамічним об'єктам кидати тіні в режимі реального часу на відкритих областях.

Після вибору режиму запікання All можна, за бажання, вказати розмір Size більше 0 для світла в інспекторі. Цей розмір використовується для забезпечення м'якіших тіней в залежності від відстані між об'єктом, що відкидає тінь і об'єктом, що отримує її. Це імітує реальний життєвий зовнішній вигляд тіні:

../../_images/baked_light_omnilight_size.png

Властивість світла Size ігнорується для тіней у реальному часі; вона стосується тільки запечених тіней. Коли властивість Size змінюється, карти освітлення змушені будуть запектися наново для відображення змін.

Запікання

Щоб розпочати процес запікання, просто натисніть кнопку Запікати карти освітлення зверху, вибравши вузол BakedLightmap:

../../_images/baked_light_bake.png

Це може зайняти від кількох секунд до хвилин (а то й годин) залежно від розміру сцени, способу запікання та обраної якості.

Балансування між часом запікання і якістю

Оскільки якісне запікання може зайняти дуже багато часу (до декількох годин для великих складних сцен), рекомендується спочатку використовувати параметри нижчої якості. Потім, коли ви будете впевнені в параметрах освітлення вашої сцени, задайте параметри високої якості та виконайте «остаточне» запікання перед експортом вашого проекту.

Примітка

За замовчуванням запікання карти освітлення, для прискорення, буде використовувати всі логічні ядра системного процесора. Це може сповільнити реакцію системи. Щоб зберегти чутливість системи під час запікання карт освітлення, можна обмежити кількість потоків процесора, які використовуються для запікання. 1, або 2, вільних потоки процесора допоможуть покращити адаптивність системи, що корисно при багатозадачності під час запікання карти освітлення, але трохи збільшить час запікання.

Для цього відкрийте Редактор > Параметри редактора та налаштуйте Editors > 3d > Lightmap Baking Number Of Cpu Threads. Значення за замовчуванням (0) використовує всі логічні ядра системного процесора. Додатні значення вказуватимуть кількість потоків для використання, тоді як від'ємні значення будуть віднімати від загальної кількості логічних ядер процесора. Наприклад, в системі з 8 логічними ядрами процесора, налаштування -1, буде використовувати 7 потоків процесора для запікання карти освітлення.

Налаштування запікання

Для запікання доступні ще кілька опцій:

  • Bake Extents: Розмір області дії. Можна редагувати в вікні перегляду 3D-редактора за допомогою повзунків. Будь-який об'єкт, який може мати запечені карти освітлення і торкається області запікання, буде мати карти освітлення, запечені для нього, але динамічне захоплення об'єкта буде працювати тільки в межах цієї області.

Коригування

  • Quality: (Якість) Передбачено чотири режими якості запікання: Low (низький), Medium (середній), High (високий) і Ultra (дуже високий). Вища якість займає більше часу, але призводить до привабливішої карти освітлення з меншим шумом. Різниця особливо помітна з випромінюючими матеріалами, або ділянками, які практично не отримують прямого освітлення.

  • Bounces: (Відскоки) Визначає скільки разів буде відбиватися непряме світло. Значення за замовчуванням (3) є хорошим компромісом між часом запікання та якістю. Вищі значення змусять світло відскакувати більше разів, перш ніж воно зупиниться, що робить непряме освітлення гладкішим (але і яскравішим). Під час початкових освітлювальних ітераційних робіт рекомендується зменшити кількість відскоків до 1 для прискорення запікання. Пам'ятайте, що ваша сцена буде темнішою, з меншою кількістю відскоків.

  • Use Denoiser: (Використовувати знешумлювач) Якщо позначене, використовуйте OpenImageDenoise, щоб зменшити шум карти освітлення. Це збільшує час запікання і, зрідка, може виводити артефакти, але часто результат того вартий.

  • Use Hdr: (Використовувати HDR) Якщо вимкнено, карти освітлення менші на диску, але вони не зможуть захопити будь-яке світло над білим (1,0). Це призведе до видимого відсікання, якщо у вашій сцені є яскраві вогні. Якщо HDR вимкнено, смуги також можуть бути видимі на карті освітлення.

  • Use Color: (Використовувати колір) Якщо вимкнено, карти освітлення будуть менші на диску, але не зможуть зберігати кольорове освітлення. При запіканні тільки непрямого світла різниця може бути ледь помітна, оскільки непряме світло, як правило, не дуже насичене. Однак при запіканні як прямого, так і непрямого освітлення, з використанням режиму запікання All, це перетворить кольорове освітлення в освітлення в градаціях сірого. Цю опцію можна вимкнути разом з HDR, щоб отримати найменший можливий файл карти освітлення з заданою роздільною здатністю.

  • Bias: (Зсув) Значення зсуву, яке використовуватиметься для тіней у 3D-одиницях. Як правило, вам не потрібно змінювати це значення, за винятком випадків, коли ви зіткнулися з проблемами просочення світла, або темними плямами, у вашій карті освітлення після запікання. Цей параметр не впливає на тіні, відкинуті на запечені поверхні, в режимі реального часу.

  • Default Texels Per Unit: (Типовий тексель на одиницю) Це значення буде використовуватися як для мешів, для яких не вказана власна щільність текселю карти освітлення. Вищі значення призводять до карт освітлення з низькою роздільною здатністю, що призводить до швидшого часу запікання та менших розмірів файлів за рахунок розмитішого непрямого освітлення та тіней.

Атлас

  • Generate: (Генерувати) Якщо увімкнете, для карти освітлення буде створено атлас текстури. Це призводить до ефективнішого рендеринга, але сумісно лише з сервером GLES3. Вимкніть цей параметр, якщо вашому проекту дозволено повертатися до GLES2. (Це не так за замовчуванням і має бути ввімкнуто в настройках проекту.) Цей параметр ігнорується, коли проект настроєно на сценарій виконання GLES2 за замовчуванням.

  • Max Size: (Максимальний розмір) Максимальний розмір атласу в пікселях. Вищі значення призводять до ефективнішого атласу, але менш сумісні зі старим/низько-класним обладнанням. Якщо ви сумніваєтеся, залиште цей параметр на його значенні за замовчуванням (4096).

Захоплення

  • Enabled: (Включене) Це дозволяє зонду захоплювати динамічні об'єкти так, що вони можуть отримувати непряме освітлення. Незалежно від значення цього параметра, динамічні об'єкти не зможуть сприяти непрямому освітленню сцени. Це обмеження карт освітлення.

  • Cell Size: (Розмір клітинки) Відстань між зондами карти освітлення в 3D-одиницях. Вищі значення призводять до рідкішого розміщення зондів, що зменшує час запікання та розмір файлу за рахунок нижчої точності освітлення для динамічних об'єктів.

  • Quality: (Якість) Якість генерації зонда карти освітлення. Вищі значення призводять до точнішого освітлення, але для запікання знадобиться більше часу. Ця настройка не впливає на щільність зондів карти освітлення, тільки на їх якість.

  • Propagation: (Розповсюдження) Подібно до властивості Propagation GIProbe. Вищі значення призводять до більш яскравого і дифузного непрямого освітлення для динамічних об'єктів. Налаштуйте це значення залежно від вашої сцени, щоб динамічні об'єкти краще відповідали статичному запеченому освітленню.

Дані

  • Light Data: (Дані світла) Містить дані запеченого світла після запікання. Текстури зберігаються на диску, але також містять дані захоплення динамічних об'єктів, які можуть бути важкими. Якщо ви використовуєте сцену у форматі .tscn, вам слід зберегти цей ресурс у зовнішньому двійковому файлі .lmbake, щоб уникнути роздування сцени .tscn двійковими даними, закодованими в Base64.

Ресурс Light Data можна редагувати, щоб налаштувати дві додаткові властивості:

  • Energy: Налаштування яскравості карти освітлення. Вищі значення призводять до яскравіших карт освітлення. Це можна регулювати під час виконання для короткочасних динамічних ефектів, таких як грози. Однак майте на увазі, що це вплине на все запечене світло.

  • Interior: Якщо увімкнено, динамічні об'єкти не будуть використовувати освітлення навколишнього середовища і будуть використовувати зонди освітлення виключно для зовнішнього освітлення. Якщо вимкнено то, і освітлення навколишнього середовища, і світлові зонди, використовуються для освітлення динамічних об'єктів.

Порада

За необхідності згенерований файл EXR можна переглядати і навіть редагувати за допомогою редактора зображень для виконання пост-обробки. Однак майте на увазі, що зміни у файлі EXR будуть втрачені при повторному запіканні карт освітлення.

Динамічні об'єкти

В інших рушіях, або реалізаціях карт освітлення, як правило, потрібно вручну розміщувати невеликі об'єкти, звані "зонди освітлення" по всьому рівню, щоб генерувати дані захоплення. Потім вони використовуються для передачі світла динамічним об'єктам, які рухаються по сцені.

Однак у цій реалізації карти освітлення використовується інший метод. Процес автоматичний, тому вам не потрібно нічого робити. Просто перемістіть свої об'єкти, і вони будуть освітлені відповідним чином. Звичайно, ви повинні переконатися, що налаштували межі своєї сцени відповідно, інакше це не спрацює.

../../_images/baked_light_indirect.gif