Я реалізував алгоритм каскадних обсягів розповсюдження світла (поки немає непрямого затінення) для дифузного глобального освітлення в режимі реального часу, детально описаного тут і тут . Це добре працює, але я все ще намагаюся виправити один артефакт.
Короткий підсумок
Ви можете пропустити це, якщо вже знаєте, як працює алгоритм.
Алгоритм працює, зберігаючи інформацію про освітлення у вигляді сферичних гармонік у 3D-сітці, де спочатку дані у кожній комірці сітки надходять від надання розширеної тіньової карти ( відбивна карта тіней), що також включає глибину кольору та звичайну інформацію. Ідея полягає в тому, що по суті всі пікселі, які бачать джерело світла, є причиною першого відскоку непрямого освітлення, тому ви зберігаєте необхідну інформацію поряд із звичайним буфером глибини, який ви використовуєте для тіньового відображення, та вибираєте всі дані для ініціалізації 3D-сітки . Інформація в 3D-сітці потім ітераційно поширюється шляхом (для кожної ітерації) поширення інформації в одній клітині всім 6 її прямим сусідам (вгорі, внизу, ліворуч, праворуч, вгорі, внизу). Щоб освітлити сцену, використовуючи інформацію в сітці, ви застосуєте повний екран проходу над вашою сценою, і для кожного растерізованого пікселя у вас є доступна позиція світового простору растерізованої поверхні (наприклад, від G-буферів у відкладеному затіненні), тож знати, до якої комірки сітки належить певний піксель на екрані.
Здебільшого це добре працює, тут є два зображення без імітованого GI та просто жорсткого коду, а поруч із ним зображення з алгоритмом LPV. Помічайте кольорові відбиття на поверхнях, кращі деталі глибини тощо.
Проблема
При огляді осередків під час етапу освітлення використовується трилінійна інтерполяція (за допомогою апаратних фільтрів текстури) для плавної інтерполяції даних між центром клітини, її сусідніми клітинками та фактичною координатою текстури. По суті, ця інтерполяція імітує поширення освітлювальної інформації в центрі комірки до конкретних пікселів навколо центру, де інформація шукається. Це потрібно, тому що в іншому випадку освітлення виглядало б дуже грубо і потворно. Однак, оскільки трилінійна інтерполяція не враховує напрямок розповсюдження світла освітлювальної інформації, кодованої в комірці (пам’ятайте, це в сферичних гармоніках), світло може бути неправильно розповсюджений на шуканий піксель. Наприклад, якщо сияння, кодоване в комірці, поширюється лише у напрямку (1,0,0) ("
Це спричиняє легке кровотеча через неправильні стінки, коли розміри комірок у сітці великі порівняно з поверхнями на сцені (це необхідно, тому що вам потрібні великі клітини для розповсюдження світла далеко на сцену з якомога меншою кількістю ітерацій поширення). Ось як це виглядає:
Як ви бачите (від тіньових обрисів у верхньому правому куті), сцена освітлюється спрямованим джерелом світла десь над сценою вгорі ліворуч. А оскільки є лише одна клітина, яка розділяє зовнішню сторону передсердя та внутрішню, світло протікає крізь стінку ліворуч неправильно.
Актуальне питання
Автор пропонує форму ручної анізотропної фільтрації, щоб виправити це. Він дає градієнт випромінювання (я припускаю коефіцієнти SH, відібрані з поточної комірки) у напрямку до нормальної поверхні n як:
І держави
Таким чином, порівнюючи похідну спрямованості випромінювання з фактичним напрямком випромінювання, можна обчислити, чи розпочнеться розподіл сяйва далі, ніж його трилінійна інтерполяція для цієї точки.
Мої питання:
В рівнянні функція c (x) здається коефіцієнтами SH в точці (x). Отже градієнт випромінювання, здається, обчислюється як звичайний числовий дериват, як зважена різниця коефіцієнтів SH в точках x - (n / 2) і x + (n / 2). Однак що таке c (x) в моєму контексті? В даний час я припускаю, що c (x) відноситься до трилінійно інтерпольованих коефіцієнтів при розташуванні поверхні (x), але я зовсім не впевнений, оскільки не знаю, як це повинно дати вам більше інформації про спрямованість розподіл коефіцієнтів SH.
І як цей градієнт потім використовується для того, щоб точно змінити те, як саме пробне освітлення з комірки точно наноситься на поверхні? Автор просто пише "порівняння похідної спрямованості випромінювання з фактичним напрямком випромінювання", але це досить невиразно.
Він згадує про використання «центральної схеми розрізнення» і посилається на ці слайди для центрального розрізнення коефіцієнтів SH, а також посилається на цей документ, який показує похідні градієнта, але зараз я не можу зробити з них жодних корисних висновків.