Як працює затінення в комп’ютерних іграх

З появою 3D-ігор, у їх творців серйозно додалося проблем: про згладжування ми вже говорили, також ми говорили і про фільтрацію текстур. Тепер же поговоримо про ще один ефект, який дозволяє серйозно поліпшити реалістичність картинки — про Ambient Occlusion (AO), або про затінення.

В оптиці можна виділити три простих градації освітленості — тінь (джерело світла не видно), півтінь (джерело світла видно частково) і освітлене місце (джерело світла видно повністю). Здавалося б, все просто, розрахувати межі тіні і півтіні можна в два рахунки з допомогою звичайних променів. Однак отримана в результаті картинка наводить на думку, що ми десь щось забули:
Таких чорних тіней не буває (ну на Землі принаймні), так що відразу стає очевидним, що ми забули — розсіяння світла: суть в тому, що в реальному часі фотони можуть відбиватися від різних поверхонь і в підсумку потрапляти туди, куди безпосередньо фотони від джерела не долітають: саме тому в тіні хоч і темніше, ніж на світлі, але не чорним-чорно. На Землі таким «розсіювачем» фотонів виступає сама атмосфера.

Але тут виникає питання — а як це розрахувати? На жаль — алгоритму, що дає 100% точний розсіяння світла в real-time, немає, проте є безліч добре наближених до реальності алгоритмів, налагоджених настільки, що вони спокійно використовуються у відеоіграх.

Для початку — загальна для всіх алгоритмів теорія: можна ввести так звану середню освітленість всієї сцени, своєрідну апроксимацію непрямого освітлення. Але от проблема в тому, що в місцях, де є тінь, така апроксимація буде давати підвищену яскравість. Тому можна дещо ускладнити її — знижувати яскравість в тих місцях, куди відбитому світлі важче дістатися. Тобто для кожного фрагмента сцени ми знаходимо так званий заграждающий фактор: кількість вільних «шляхів» для фотона поділена на всі кількість шляхів фотона до даної ділянки, і на основі цих даних і середньої яскравості сцени можна розрахувати яскравість конкретної ділянки.

Однак тут ми отримуємо чергову проблему — побудова геометрії відбувається поступово, тому заграждающий фактор також у процесі відтворення може серйозно змінюватися. Можна, звичайно, розрахувати AO на етапі завантаження сцени, але тоді затінення не торкнеться динамічних об’єктів (персонажів, машин і т. д.) — а це недобре. І тут приходить ідея використовувати для малювання затінення простір екрану (Screen Space), що в підсумку виливається в найпростіший алгоритм AO — SSAO.

SSAO

Цей алгоритм з’явився ще в Crysis 10 років тому. Його суть проста: після побудові геометрії у нас залишається Z-буфер, або буфер глибини, який включає в себе абсолютно всю інформацію про геометрію сцени — а значить ніяких проблем зробити AO немає.

Хоча, звичайно, кого я обманюю — проблеми є, і найсерйозніша — недостатня продуктивність сучасних відеокарт: для того, щоб отримати більш-менш непогану карту затінення, для кожного фрагмента сцени потрібно обраховувати близько 200-250 напрямків, що дозволяє «закопати» будь-GPU. Тому робиться хитріше — використовується 8-32 «променя», спрямовані на вибраний фрагмент сцени, які кожен раз повертаються на випадкове значення. У підсумку виходить задовільна якість картинки з не дуже великими витратами на розрахунки:

Надалі алгоритм був дороблений — стали використовуватися карти нормалей, що знизило складність вдвічі і дозволило в підсумку удвічі збільшити число вибірок. Ну і фінальний штрих — стали використовувати розмиття, щоб згладити шум від випадкових вибірок.

HBAO і HBAO+

Nvidia не була б Nvidia, якщо б не стала розвивати затінення далі, представивши в 2008 році HBAO — Horizon Based Ambient Occlusion. Від SSAO це затінення відрізнялося тим, що воно засновано на фізичній моделі, де апроксимується інтеграл освітленості фрагмента сцени зі значеннями вибірки буфера глибини. Підсумкове якість виявляється вище SSAO при великому числі вибірок, але ми знову впираємося в продуктивність. Тому HBAO рендерится зазвичай у більш низькому дозволі, що призводить до мерехтіння картинки.

Проблема мерехтіння була виправлена в HBAO+ простим методом, який зараз активно використовує Sony в 4К іграх на PlayStation 4 Pro: для розрахунку HBAO+ використовується шаховий рендеринг, тобто для обробки затінення використовується частина попереднього кадру і половина нового: це вимагає менше витрат GPU, але при цьому дозволяє рендери затінення у вихідному дозволі, що і прибирає мерехтіння.

HDAO

AMD осторонь не залишилися, і стали використовувати власне затінення (яке, до речі, також працює і на Nvidia) — HDAO (High Definition AO). На жаль, AMD не ділиться алгоритмом, проте відомо, що в його основі лежить Gather4 — технологія, яка збирає 4 текселя в один регістр. Тобто, як і з HBAO, по суті відбувається рендеринг в зниженому дозволі. У результаті, В середньому картинка з HBAO і HDAO порівнянна за якістю, але знову ж таки — все досить сильно залежить від гри: наприклад, в Far Cry 3 з HDAO трава виглядає красивіше:

VXAO

З виходом DX12 Nvidia представила принципово нове затінення — VXAO (Voxel Accelerated Ambient Occlusion). Його суть в тому, що воно працює вже не з пікселями і текселями (тобто 2D-об’єктами), а з вокселями — аналогом пікселя в 3D. І тепер ми не використовуємо Z-буфер, а воксельное побудова сцени, тому алгоритм складається з трьох пунктів: вокселизация, постобробка вокселей і трасування конуса. Вокселизация виконується шляхом візуалізації трикутних сіток в тривимірну структуру, і тому її продуктивність сильно залежить від загальної кількості трикутників, розміру цих трикутників і кількості викликів малювання, необхідних для їх візуалізації. Постобробка об’єднує проходи, такі як очищення, фільтрування та понижуючі вибірки вокселей, а її продуктивність залежить від загальної кількості вокселей, створених під час вокселизации. Типовий час після обробки становить 0,5 – 1,5 мс. І, нарешті, трасування конуса виконується в просторі екрану, тому його продуктивність залежить від дозволу екрану і швидкості затінення. Підсумкове якість картинки виявляється в куди краще, ніж з HBAO+:

На цьому все. Поради для гравців прості: якщо комп’ютер добре тягне гру без AO, то можна спробувати включити SSAO або HBAO — зазвичай це знижує fps не більше ніж на 10%. Якщо ж і з ними відмінна продуктивність — можна спробувати HBAO+ і HDAO. Ну і для самих топових відеокарт сучасності можна порекомендувати набирає обертів VXAO — воно вкрай вимогливо до ресурсів (в тому числі і до відеопам’яті), тому навіть у FHD воно буде доступно лише користувачам старших Nvidia GTX 900ой і 1000ой лінійки, а також власникам старших AMD RX, Fury і Vega.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *