Графіка в режимі реального часу використовує різноманітні наближення до обчислювальних витрат, що імітують непряме освітлення, торгуючи між продуктивністю виконання та надійністю освітлення. Це область активних досліджень, щороку з’являються нові методи.
Навколишнє освітлення
У самому простому кінці діапазону можна використовувати освітлення навколишнього середовища : глобальне, всенаправлене джерело світла, яке застосовується до кожного об'єкта в сцені, без огляду на фактичні джерела світла чи локальну видимість. Це зовсім не точно, але надзвичайно дешево, легко налаштувати художника, і може виглядати нормально залежно від сцени та бажаного візуального стилю.
Загальні розширення до базового освітлення включають:
- Зробіть, щоб колір навколишнього середовища змінювався напрямком, наприклад, використовуючи сферичні гармоніки (SH) або невелику кубічну карту та шукаючи колір у шейдері на основі нормального вектора кожної вершини чи пікселя. Це дозволяє певну візуальну диференціацію між поверхнями різної спрямованості, навіть там, де пряме світло не досягає їх.
- Застосовуйте методи зовнішньої оклюзії (AO) , включаючи попередньо обчислені вершини AO, карти текстури AO, поля AO та AO простору екрану (SSAO) . Всі вони працюють, намагаючись виявити такі ділянки, як отвори і щілини, де непряме світло менше шансів відскочити і затемнити навколишнє світло там.
- Додайте екологічну кубічну карту, щоб забезпечити навколишнє дзеркальне відображення. Кубемапа з гідною роздільною здатністю (128 ² або 256 ² на обличчя) може бути досить переконливою для окулярів на вигнутих, блискучих поверхнях.
Запечене непряме освітлення
Наступний "рівень", так би мовити, прийомів передбачає випікання (попереднє обчислення в режимі офлайн) деякого зображення непрямого освітлення на сцені. Перевага випічки полягає в тому, що ви можете отримати досить якісні результати за невеликі обчислювальні витрати в режимі реального часу, оскільки всі важкі частини виконуються при випічці. Компроміс полягає в тому, що час, необхідний для процесу випічки, шкодить рівню ітерації дизайнерів; потрібно більше пам’яті та дискового простору для зберігання попередньо обчислених даних; можливість зміни освітлення в режимі реального часу дуже обмежена; і процес запікання може використовувати інформацію лише з статичної геометрії рівня, тому непрямі освітлювальні ефекти від динамічних об'єктів, таких як символи, будуть пропущені. І все-таки печене освітлення дуже широко використовується в іграх AAA сьогодні.
Крок запікання може використовувати будь-який потрібний алгоритм візуалізації, включаючи відстеження траєкторій, радіовипромінювання або використання самого ігрового двигуна для виведення кубічних карт (або півмісяців ).
Результати можуть бути збережені у текстурах ( світлових картах ), застосованих до статичної геометрії на рівні, та / або вони також можуть бути перетворені в SH та збережені в об'ємних структурах даних, таких як обсяги опромінення (текстури обсягу, де кожен тексель зберігає зонд SH) або чотиригранні сітки . Потім можна використовувати шейдери для пошуку та інтерполяції кольорів із цієї структури даних та застосувати їх до відображеної геометрії. Об'ємний підхід дозволяє застосовувати пече освітлення як динамічним об'єктам, так і статичній геометрії.
Просторове дозвіл світлових карт тощо буде обмежено пам’яттю та іншими практичними обмеженнями, тому ви можете доповнити запечене освітлення деякими AO-методами, щоб додати деталі високої частоти, які не може забезпечити засвічене освітлення, та відповісти на динамічні об’єкти (наприклад, затемнення непрямого світла під рухомим символом чи транспортним засобом).
Існує також техніка під назвою попередньо обчислена радіаційна передача (PRT) , яка розширює випічку для більш динамічних умов освітлення. У PRT, замість того, щоб випекти саме непряме освітлення, ви випікаєте функцію передачі від якогось джерела світла - зазвичай неба - до непрямого непрямого освітлення в сцені. Функція передачі представлена у вигляді матриці, яка перетворює від вихідного до кінцевого коефіцієнти SH в кожній точці вибірки. Це дозволяє змінювати освітлене середовище, а непряме освітлення на сцені реагуватиме правдоподібно. Far Cry 3 і 4 використовували цю методику, щоб дозволити безперервний цикл день-ніч, непряме освітлення змінюється залежно від кольорів неба в кожен час доби.
Ще один момент щодо випічки: може бути корисним мати окремі запечені дані для дифузного та дзеркального непрямого освітлення. Cubemap працює набагато краще, ніж SH для окулярів (оскільки кубічні карти можуть мати набагато більше кутових деталей), але вони також займають набагато більше пам’яті, тому ви не можете дозволити собі розміщувати їх так щільно, як зразки SH. Корекція паралакса може бути використана, щоб дещо компенсувати це, евристично перекочуючи кубічну карту, щоб її відображення відчували себе більш обґрунтованими до геометрії навколо неї.
Повністю методи реального часу
Нарешті, можна обчислити повністю динамічне непряме освітлення на GPU. Він може реагувати в режимі реального часу на довільні зміни освітлення або геометрії. Однак знову є компроміс між виконанням часу виконання, вірністю освітлення та розміром сцени. Деяким із цих методів потрібен взаємний GPU, щоб взагалі працювати, і можливо, це можливо лише для обмежених розмірів сцени. Вони, як правило, підтримують лише один відбій непрямого світла.
- Динамічна кубічна карта середовища, де грані кубічної карти відтворюються кожен кадр за допомогою шести камер, згрупованих навколо обраної точки, може забезпечити пристойно хороші відбиття навколишнього середовища для одного об’єкта. Наприклад, це часто використовується для автомобілів гравців у гоночних іграх.
- Глобальне освітлення екранного простору , розширення SSAO, яке збирає освітлення від відточених пікселів на екрані в проході після обробки.
- Рефлекторне відбиття екранного простору працює шляхом проміння променів через буфер глибини в пост-проході. Він може забезпечити досить якісні відображення до тих пір, поки відображені предмети на екрані.
- Система миттєвого випромінювання працює за допомогою відстеження променів у сцені за допомогою процесора та розміщення точкового світла у кожній точці удару променя, що приблизно представляє відходить світло у всіх напрямках від цього променя. Ці багато вогнів, відомих як віртуальні точкові світильники (VPL), потім передаються GPU звичайним способом.
- Світловідбиваючі тіньові карти (RSM) схожі на миттєву радіовипромінювання, але VPL генеруються за допомогою відображення сцени з точки зору світла (як тіньова карта) та розміщення VPL на кожному пікселі цієї карти.
- Обсяги поширення світла складаються з 3D-сіток зондів SH, розміщених по всій сцені. РСМ надаються та використовуються для "впорскування" світла відбиття в зонди SH, що знаходяться поблизу відбиваючих поверхонь. Потім процес, що заповнює заливку, поширює світло від кожного зонда SH до навколишніх точок сітки, і результат цього використовується для нанесення освітлення на сцену. Ця методика поширилася і на об'ємне розсіювання світла .
- Відстеження конусу Вокселя працює за допомогою вокселізації геометрії сцени (можливо, із застосуванням різної роздільної здатності вокселів, точніше біля камери та більш грубої відстані), а потім введення світла від RSM в мережу вокселів. Під час візуалізації основної сцени піксельний шейдер виконує «конусовий слід» - промінь проміння з поступово збільшуючим радіусом - через воксельну сітку для збору вхідного світла для дифузного або дзеркального затінення.
Більшість із цих прийомів сьогодні не широко використовуються в іграх через проблеми з масштабуванням до реалістичних розмірів сцен або іншими обмеженнями. Виняток - це відображення простору на екрані, яке є дуже популярним (хоча воно зазвичай використовується з куб-картами як резервна копія для регіонів, де частина екрану-простору не вдається).
Як бачимо, непряме освітлення в режимі реального часу - це величезна тема, і навіть ця (досить довга!) Відповідь може лише забезпечити огляд у 10000 футів та контекст для подальшого читання. Який підхід для вас найкраще залежатиме від деталей вашої конкретної заявки, які обмеження ви готові прийняти та скільки часу вам потрібно вкласти.