Ambient Occlusion Volumes для затятих самоварів

Блукаючи по інтернету в пошуках алгоритмом освітлення, які б задовольнили мої потреби, я натрапив на досить новий алгоритм, розроблений компанією NVIDIA, назва якого AOV (Ambient Occlusion Volumes). Маючи в своєму розпорядженні темні осінні ночі і кілька чашок гарячої кави, я зважився вивчити даний алгоритм, наслідком чого є ця стаття. Перш ніж я почну, хотілося б відзначити своє здивування з приводу того, що даний алгоритм має незаслужено малу популярність в колах розробників ігор, на відміну від всіма знайомого нам SSAO. Зміст даної статті буде, більшою мірою, складатися з теорії.

Введення
У червні 2010 року Morgan McGuire, дослідник і розробник компанії NVIDIA, розробив алгоритм освітлення, який носить назву Ambient Occlusion Volumes. При розробці даного алгоритму, M. McGuire, ставив собі за мету домогтися більш високої продуктивності та якості освітлення. Продуктивність алгоритму, за словами розробника, в чому незалежна від складності моделей, а за якістю освітлення не поступається Ray Tracing'у.

Трохи про Ambient Occlusion
AO(Ambient Occlusion) є наближеним до GI(Global Illumination) алгоритмом, призваним до затінення просторів, на яких, фактично, не падають промені світла з причини того, що дані простору умовно перекриваються іншими об'єктами, роблячи недоступним потрапляння променів світла до цього простору. Сам алгоритм працює шляхом обчислення променів, що виходять із точки, затінення якої ми перевіряємо, з наступною перевіркою на перетин об'єкта променем. Якщо промінь проходить без перешкод, то дана точка освітлена, інакше — затінена.
image
Але при розрахунку таким алгоритмом виникають якісь труднощі. Через деякий час на заміну старому алгоритмом прийшов SSAO(Screen Space Ambient Occlusion) від розробників компанії Crytek. Сам алгоритм працював за таким принципом, що визначається певна сфера і в діапазоні цієї сфери випадково відбираються точки після чого йде перевірка глибин(перш записаних в буффер глибин) цих точок з тією, для якої ми обчислюємо затінення. Якщо глибина останньої більше за глибину випадкової точки, то вона — затінена, а інакше, відповідно, освітлена. Виконується кілька таких перевірок, після чого їх результати сумуються і обчислюється коефіцієнт затінення. Виглядає воно приблизно так:


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

Далі мені б хотілося розглянути ще одну важливу тему перед тим як буде описано AOV метод.

Radiosity
Багато з тих, хто знайомий з названим методом насупилися б почувши даний метод в контексті Amient Occlsuion. Насправді, ці методи тісно пов'язані один з одним.

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

Метод radiosity, так само відомий як метод излучательности, є одним з методів GI, який спирається на розрахунок форм-факторів(form-factors), які, в свою чергу, описують обмін енергією між парами площин в навколишньому середовищі.

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


Обчислюється форм-фактор таким чином:


де θi,j — кут між нормаллю до площини і Ri,j,, dA1,2 — диференціальна область площини, Ri,j — вектор відстані між dA1,2. У даному рівнянні HID дорівнює одиниці, якщо dA1,2 видимі один для одного і нуль, якщо навпаки.

На розквіті даного методу використовувалися два підходи: Full Matrix Radiosity та Progressive Refinement Radiosity.

Full Matrix Radiosity
Суть даного підходу полягає в тому, що навколишнє середовище дискретизирована в маленькі площині. Для кожної пари площин обчислюється форм-фактори. Після, форм-фактори використовують для створення системи рівнянь, яка встановлює зв'язок між площинами в навколишньому середовищі. Вирішивши цю систему, ми отримуємо інтенсивність світла, яке випромінює площину. Одного разу прорахувавши інтенсивність, оточення може бути представлене в будь-якому положенні без додаткових розрахунків освітлення.

Інтенсивність світла, яке випромінює площину обчислюємо таким способом:


де pi -коефіцієнт відбиття площині i; fijo caracas включно < — форм-фактор з площини i до площини j; Ii — raidosity площині i; Iei — інтенсивність випромінювання площині i; N — кількість площин які знаходяться в оточенні.

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

Форм-фактор від патча до патчу обчислюється так:


де Ei — кількість елементів в патчі, Fej — форм-фактор від елемента e до патчу j, Ai,e — області патча і елемента.

Progressive Refinement Radiosity
Даний підхід заснований на попередньому. Особливість даного підходу полягає в тому, що після кожної ітерації відбувається перерахунок, а саме інкремент значення излучательности площині. Розраховується вона таким чином:


де Ii — вже розраховане значення излучательности.

Проблемою даних підходів є складність розрахунків навіть при простих формах об'єктів. Щоб обчислити форм-фактор площині нам потрібно провести два рази інтегрування, не кажучи вже про зайвих розрахунках. На вирішення цієї проблеми прийшов Hemi-Cube Radiosity.

Hemi-Cube Radiosity
HC має схожість з алгоритмом Nussalt Analog. Суть його була в тому, що навколо точки на площині розміщується так звана проекційна півсфера з одиничним радіусом. Інша площина проектується на цю півсферу і розміщується на базі півсфери. Таким чином форм-фактор буде дорівнює відношенню області спроектований площині в базі півсфери до самої бази півсфери. Алгоритм HC використовує в своїй реалізації, як ви вже могли здогадатися, полукуб.

Сторони полукуба розбиваються на набір невеликих дискретизированных площин(hemi-cube pixels), кожна з яких має свій предрассчитанный форм-фактор. Коли друга площина проектується на полукуб, сума форм-факторів дискретних областей на яких була спроецированна площина буде дорівнювати значенню форм-фактора від точки на першій площині до другої площини.


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

Ambient Occlusion Volume
Під час розробки методу radiosity, Baum D. R. запропонував такий метод обчислення форм-фактора:


де Gi — набір граней площині, Nj — нормаль диференціальної площині j, Гд — величина рівна куті гамма і напрямом отриманого при векторному добутку Rg і R(g+1), як показано на малюнку знизу:


M. McGuire надихнувся цим підходом і на основі останнього придумав AO алгоритм. Описував він його так:

Нехай X буде дуже маленьким патчем гладкого різноманіття. Центроїд X буде в точці, яка є початком нормалі n. Полігоном P буде полігон з вершинами {p0,...,pk−1}, який повністю розташований на позитивній частині площини, при умові p*n > 0. Таким чином, перепони променів світла, що створюється полігоном P, буде одно форм-фактору випромінювальної здатності між P і X.


де j = (i+1) mod k.

Реалізація AOV's

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

Розглянемо опуклий полігон P з вершинами {p0,...,pk−1}, які при будь-якій комбінації з 3-х вершин не створюють коллинеарности. Спершу, нам потрібно розрахувати згасаючу функцію, яка нам знадобитися щоб досягти плавності при переходах від near — до far-field висвітлення. Обчислюється вона таким чином:


де а — 1 для твердих площин, m(i<k) — нормалі до межі полігону P, mk — негативна нормаль до полігону P:



Виглядає вона таким чином:


Наступним пунктом в нашій реалізації буде побудова обсягу навколо нашого полігону.
Щоб це зробити, нам потрібно розрахувати вектор зміщення, який знадобитися для зміщення вершин нашого щодо обсягу вершин полігону.

Хочеться внеси ще один новий термін, який називається obscurance. Він відповідає за загасання ефекту перекриття зі зміною відстані.

Вектор зміщення ми отримуємо таким чином:


де δ є тим самим obescurance на максимальній дистанції.

Для наочності:


І останнім нашим кроком буде твір затухаючої функції( g ) на перекриття полігоном P ( AOp(n) ). Так само, після всіх операцій слід застосувати т. н. blending.

Після всього написаного тут було б гріхом не докласти скріншоти, які продемонструють роботу AOV алгоритму. Ці скріншоти були зроблені компанією NVIDIA, а демо можна знайти внизу статті(знову ж від NVIDIA).

image
image

Для порівняння з Ray Tracing'ом:

image
Висновок
Ми розглянули досить непростий спосіб AO. Багато можуть залишитися незадоволені, бо, найімовірніше, жадали побачити реалізацію у вигляді коду. На жаль, занадто багато інформації вийшло б лише для однієї статті. Втім, ті хто загорівся бажанням реалізувати даний метод, може копнути вглиб демо від NVIDIA, яке я докладу знизу.

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

Демо від NVIDIA

Література
Мною було прочитано достатню кількість джерел, але основний упор я робив саме на ці паперы:

— M. McGuire «Ambient Occlusion Volumes»
— «Improving radiosity solutions through the use of analytically determined form-factors»

Також хочу зазначити, що більшість зображень було взято з останнього папера.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.