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.

Вступ до глобального освітлення

Що таке глобальне освітлення?

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

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

../../../_images/global_illumination_example.webp

Глобальне освітлення складається з кількох ключових понять:

Непряме дифузне освітлення

Це освітлення, яке не змінюється залежно від кута камери. Існує два основних джерела непрямого розсіяного освітлення:

  • Світло підскакує на поверхні. Це відбите освітлення помножується на колір альбедо матеріалу. Відбите світло може потім відбиватися іншими поверхнями зі зменшенням впливу через ослаблення світла. У реальному житті світло відбивається нескінченну кількість разів. Однак з міркувань продуктивності це не можна симулювати в ігровому движку. Натомість кількість відскоків зазвичай обмежена 1 або 2 (або до 16 під час запікання карт світла). Більша кількість відскоків призведе до більш реалістичного падіння світла в затінених областях ціною нижчої продуктивності або більшого часу випікання.

  • Емісійні матеріали також можуть випромінювати світло, яке може відбиватися на поверхнях. Це діє як форма освітлення території. Замість того, щоб нескінченно мала точка випромінювала світло за допомогою вузла OmniLight3D або SpotLight3D, область певного розміру випромінюватиме світло, використовуючи власну поверхню.

Пряме дифузне освітлення вже обробляється самими світловими вузлами, що означає, що алгоритми глобального освітлення намагаються представити лише непряме освітлення.

Різні методи глобального освітлення пропонують різні рівні точності для представлення непрямого розсіяного освітлення. Для отримання додаткової інформації перегляньте порівняльну таблицю внизу цієї сторінки.

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

Примітка

Непряме розсіяне освітлення може бути джерелом кольорових смуг у сценах без детальних текстур. Це призводить до того, що градієнти світла не є плавними, а натомість мають видимий «ступінчастий» ефект. Перегляньте розділ Розшарування кольорів в документації щодо обмежень 3D-візуалізації, щоб дізнатися про способи зменшення цього ефекту.

Дзеркальне освітлення

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

Більшість методів глобального освітлення пропонують спосіб відтворення дзеркального освітлення. Однак ступінь точності, з якою відображається дзеркальне освітлення, сильно відрізняється від техніки до техніки. Для отримання додаткової інформації перегляньте порівняльну таблицю внизу цієї сторінки.

Щоб забезпечити точніші відображення малих об’єктів, можна ввімкнути відображення екранного простору (SSR) у налаштуваннях environment. SSR має значні витрати на продуктивність (навіть більше, ніж SSAO), тому обов’язково вимкніть його, коли націлюєтеся на апаратне забезпечення нижчого класу.

Яку техніку глобального освітлення слід використовувати?

Визначаючи методику глобального освітлення (GI), яку слід використовувати, слід пам’ятати про кілька критеріїв:

  • Ефективність. Техніки GI в реальному часі зазвичай дорожчі порівняно з техніками напівреального часу або запеченими. Зауважте, що більша частина витрат на рендеринг GI витрачається на GPU, а не на CPU.

  • Візуальні елементи. Окрім ненайкращої ефективності, методи GI в реальному часі зазвичай не забезпечують найкращого візуального результату. Особливо це стосується здебільшого статичної сцени, де динамічну природу GI в реальному часі нелегко помітити. Якщо вашою метою є максимізація візуальної якості, запечені техніки часто виглядатимуть краще та призведуть до меншої кількості витоків світла.

  • Можливість роботи в режимі реального часу. Деякі методи GI повністю працюють у режимі реального часу, тоді як інші – лише напів-реального часу або взагалі не працюють у реальному часі. Методи напівреального часу мають обмеження, яких не мають методи повністю реального часу. Наприклад, динамічні об’єкти можуть не створювати емісійного освітлення сцени. Техніки, що не працюють у реальному часі, не підтримують будь-яку форму динамічного GI, тому її потрібно підробити за допомогою інших методів, якщо це необхідно (наприклад, розміщення позиційних вогнів біля емісійних поверхонь). Здатність працювати в режимі реального часу також впливає на життєздатність техніки GI на процедурно згенерованих рівнях.

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

Ось порівняння всіх методів глобального освітлення, доступних у Godot:

Швидкодія

У порядку продуктивності від найшвидшої до найповільнішої:

  • Відбиваючий зонд:

    • ReflectionProbes з режимом оновлення, встановленим на Завжди, набагато дорожчі, ніж зонди з режимом оновлення, встановленим на Один раз (за замовчуванням). Підходить для інтегрованої графіки в режимі оновлення Once. Доступний у всіх рендерерах.

  • LightmapGI:

    • Лампи можна запалювати лише непрямим освітленням або повністю розпалити на основі світла для подальшого покращення продуктивності. Можна використовувати гібридні налаштування (наприклад, спрямоване світло в режимі реального часу та повністю запечене позиційне світло). Інформацію про напрямок можна ввімкнути перед запіканням, щоб покращити візуальні ефекти за невеликих витрат на продуктивність (і за рахунок більших розмірів файлів). Підходить для інтегрованої графіки. Доступний у всіх рендерерах. Однак для запікання карт освітлення потрібне обладнання з підтримкою RenderingDevice.

  • VoxelGI:

    • Кількість підрозділів випічки можна регулювати, щоб збалансувати продуктивність і якість. Якість візуалізації VoxelGI можна налаштувати в налаштуваннях проекту. Візуалізацію можна додатково виконати з половинною роздільною здатністю (а потім лінійно масштабувати), щоб значно підвищити продуктивність. Недоступно під час використання мобільних або сумісних рендерів.

  • Непряме освітлення екранного простору (SSIL):

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

  • SDFGI:

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

Візуальні матеріали

Для порівняння, ось тривимірна сцена без використання параметрів глобального освітлення:

Тривимірна сцена без будь-якої форми глобального освітлення (лише постійне освітлення середовища). Ящик і сфера біля камери є динамічними об’єктами.

Тривимірна сцена без будь-якої форми глобального освітлення (лише постійне освітлення середовища). Ящик і сфера біля камери є динамічними об’єктами.

Ось як порівнюються різні методи глобального освітлення Godot:

  • VoxelGI: середній Хороші відбиття та непряме освітлення, але остерігайтеся витоків.

    • Через свою воксельну природу VoxelGI демонструватиме витік світла, якщо стіни та підлога занадто тонкі. Рекомендується переконатися, що всі суцільні поверхні мають товщину принаймні одного вокселя.

      На похилих поверхнях також можуть бути помітні смуги. У цьому випадку налаштування властивостей зміщення або обертання вузла VoxelGI може допомогти впоратися з цим.

      VoxelGI в дії.

      VoxelGI в дії.

  • SDFGI: середній Гарне відображення та непряме освітлення, але остерігайтеся витоків та видимих каскадних зсувів.

    • Рівень деталізації GI змінюється залежно від відстані між камерою та поверхнею.

      Витоки можна значно зменшити, увімкнувши властивість Use Occlusion. Це має невелику вартість продуктивності, але часто призводить до меншої кількості витоків порівняно з VoxelGI.

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

      SDFGI в дії.

      SDFGI в дії.

  • Непряме освітлення екранного простору (SSIL): середній Гарне вторинне джерело непрямого освітлення, але без відблисків.

    • SSIL призначений для використання як доповнення до іншого методу GI, такого як VoxelGI, SDFGI або LightmapGI. SSIL найкраще підходить для дрібних деталей, оскільки сам по собі не може забезпечити точне непряме освітлення для великих структур. SSIL може забезпечити непряме освітлення в режимі реального часу в ситуаціях, коли інші методи GI не можуть захопити дрібні деталі або динамічні об’єкти. Його природа екранного простору призведе до деяких артефактів, особливо коли об’єкти входять і залишають екран. SSIL працює з використанням кольору останнього кадру (перед постобробкою), що означає, що емісійні наклейки та спеціальні шейдери включені (поки вони присутні на екрані).

      SSIL в дії (без будь-якої іншої техніки GI). Зверніть увагу на емісійне освітлення навколо жовтої коробки.

      SSIL в дії (без будь-якої іншої техніки GI). Зверніть увагу на емісійне освітлення навколо жовтої коробки.

  • LightmapGI: добре Чудове непряме освітлення, гідні відбиття (опціонально).

    • Це єдина техніка, у якій кількість відскоків світла може бути вище 2 (до 16). Коли ввімкнено інформацію про спрямованість, сферичні гармоніки (SH) використовуються для створення розмитих відображень.

      LightmapGI в дії. Тут запікається лише непряме освітлення, але можна також запікати пряме світло.

      LightmapGI в дії. Тут запікається лише непряме освітлення, але можна також запікати пряме світло.

  • ReflectionProbe: середній Гарне відображення, але погане непряме освітлення.

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

      ReflectionProbe в дії (без будь-якої іншої техніки GI). Зверніть увагу на відбиваючу сферу.

      ReflectionProbe в дії (без будь-якої іншої техніки GI). Зверніть увагу на відбиваючу сферу.

Можливість роботи в реальному часі

  • VoxelGI: добре Повністю в реальному часі.

    • Непряме освітлення та відображення повністю в реальному часі. Динамічні об'єкти можуть отримувати GI і сприяти цьому своїми емісійними поверхнями. Спеціальні шейдери також можуть випромінювати власне світло, яке буде випромінюватися точно.

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

  • SDFGI: середній Напівреальний час.

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

      Динамічні об'єкти можуть отримувати GI, але не сприяти йому. Емісійне освітлення оновлюється лише тоді, коли об’єкт потрапляє в каскад, тому воно все ще може працювати для об’єктів, що повільно рухаються.

  • Непряме освітлення екранного простору (SSIL): добре Повністю в реальному часі.

    • SSIL працює як зі статичним, так і з динамічним світлом. Він також працює як зі статичними, так і з динамічними оклюдерами (включаючи емісійні матеріали).

  • LightmapGI: погано Печений, а тому не в реальному часі.

    • І непряме освітлення, і відображення SH запікаються, і їх не можна змінити під час виконання. GI в реальному часі має бути simulated via other means, таких як позиційні вогні в реальному часі. Динамічні об’єкти отримують непряме освітлення через світлові зонди, які користувач може розмістити автоматично або вручну (вузол LightmapProbe). Неможливо для процедурно згенерованих рівнів, оскільки запікання карт освітлення можливе лише в редакторі.

  • ReflectionProbe: середній За бажанням у реальному часі.

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

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

Потрібна робота користувача

  • VoxelGI: потрібно створити та запекти один або кілька вузлів VoxelGI.

    • Щоб отримати хороші результати, необхідно правильно налаштувати екстенти. Крім того, обертання вузла та повторне випікання може допомогти боротися з витоками або смугами артефактів у певних ситуаціях. Час запікання швидкий – зазвичай менше 10 секунд для сцени середньої складності.

  • SDFGI: Дуже мало.

    • SDFGI є повністю автоматичним; його потрібно лише ввімкнути в ресурсі середовища. Єдина робота, яка потрібна вручну, — це правильно встановити властивість режиму запікання MeshInstances. Не потрібно створювати вузол і не потрібно випікання.

  • Непряме освітлення екранного простору (SSIL): Дуже мало.

    • SSIL є повністю автоматичним; його потрібно лише ввімкнути в ресурсі середовища. Не потрібно створювати вузол і не потрібно випікання.

  • LightmapGI: Потрібні налаштування та запікання UV2.

    • Статичні сітки потрібно повторно імпортувати з увімкненим UV2 і створенням карти освітлення. На виділеному графічному процесорі час запікання відносно швидкий завдяки запіканню карти освітлення на основі графічного процесора – зазвичай менше 1 хвилини для сцени середньої складності.

  • ReflectionProbe: розміщується користувачем вручну.

Підсумок

Якщо ви не впевнені, яку методику GI використовувати:

  • Для настільних ігор доцільно спочатку почати з SDFGI, оскільки це вимагає найменших налаштувань. Перейдіть до інших методів GI пізніше, якщо це необхідно. Щоб підвищити продуктивність на графічних процесорах нижчого класу та інтегрованій графічній карті, подумайте про те, щоб додати опцію для вимкнення SDFGI або VoxelGI в налаштуваннях гри. SDFGI можна вимкнути в ресурсі середовища, а VoxelGI можна вимкнути, приховавши вузол(и) VoxelGI. Щоб ще більше покращити візуальні ефекти у висококласних налаштуваннях, додайте опцію для ввімкнення SSIL у налаштуваннях гри.

  • Для мобільних ігор LightmapGI і ReflectionProbes є єдиними підтримуваними варіантами. Дивіться також Альтернативи методикам ГІ.

Дивись також

Ви можете порівняти методи глобального освітлення в дії за допомогою демонстраційного проекту Global Illumination <https://github.com/godotengine/godot-demo-projects/tree/master/3d/global_illumination>`__.

Який режим глобального освітлення слід використовувати для сіток і світильників?

Незалежно від того, яку техніку глобального освітлення ви використовуєте, не існує універсального «кращого» режиму глобального освітлення. І все ж ось кілька рекомендацій щодо сіток:

  • Для геометрії статичного рівня використовуйте режим глобального освітлення Статичний (за замовчуванням).

  • Для невеликої динамічної геометрії та гравців/ворогів використовуйте режим глобального освітлення Відключено. Невелика динамічна геометрія не зможе забезпечити значну кількість непрямого освітлення, оскільки геометрія менша за воксель. Якщо вам потрібне непряме освітлення для невеликих динамічних об’єктів, його можна змоделювати за допомогою вузла OmniLight3D або SpotLight3D, доданого до об’єкта.

  • Для великої геометрії динамічного рівня (наприклад, рухомого поїзда) використовуйте режим глобального освітлення Динамічний. Зауважте, що це впливає лише на VoxelGI, оскільки SDFGI та LightmapGI не підтримують глобальне освітлення динамічних об’єктів.

Ось кілька рекомендацій щодо легких режимів випічки:

  • Для статичного рівня освітлення використовуйте режим випічки Статичний. Режим Статичний також підходить для динамічного освітлення, яке не сильно змінюється під час гри, наприклад мерехтливого ліхтарика.

  • Для короткочасних динамічних ефектів (наприклад, зброї) використовуйте режим запікання Відключено, щоб покращити продуктивність.

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

Альтернативи методикам ГІ

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

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