Quake II RTX: ray tracingová laboratoř
5.2.2020, Jan Vítek, recenze
Dnes se podíváme i z praktického hlediska na téma ray tracingu ve hře Quake II. Ta má svou éru již dávno za sebou, ovšem právě kvůli její celkové nenáročnosti se mohli vývojáři slušně rozšoupnout s implementací ray tracingu.
Kapitoly článku:
Path tracing, neboli "ray tracing na steroidech", jsme zmínili už v souvislosti s Minecraftem, který se díky tomuto vykreslování dokáže změnit k nepoznání. To je ostatně i nejlepší příklad toho, co ray tracing obecně dokáže a logicky je to nejlépe vidět na hře s velice jednoduchou grafikou, zatímco v AAA hře využívající nejnovější techniky rasterizačních enginů kolikrát můžeme jen těžko postřehnout rozdíly.
Path tracing v Quake II RTX
My se nyní podíváme na přehled toho, jak byl do Quake II implementován path tracing, k čemuž tu máme od NVIDIE jednoduchý obrázek znázorňující cestu pomyslného světelného paprsku od oka pozorovatele.
Pokud by se scéna vykreslila pouze pomocí primárního paprsku (1), neviděli bychom nic, protože ten nedoputoval ke zdroji světla. Když by se ale zvedl celkový jas scény, čili přidala intenzita pro ambientní osvětlení, už bychom scénu viděli, ale pouze tak, že veškeré povrchy by byly osvětleny zcela stejně, neexistovalo by tu stínování ani stíny samotné.
Primární paprsek nám ale dospěje k povrchu objektu, který světlo jednak zčásti láme a zčásti odráží, což může být třeba vodní hladina nebo sklo. Probíhá tu tak odraz světla / reflexe (2A) a lom světla / refrakce (2B).
Dále už sledujeme odražený paprsek, který doputuje k objektu a od něj pokračuje k jednomu náhodně vybranému lokálnímu zdroji světla (3), což by v reálném světe byla třeba žárovka v místnosti. Počítat se ale může také se sluncem jako hlavním zdrojem světla (4), díky čemuž ostatně mohou být vykreslované scény tak věrné. Tím to ovšem v rámci path tracingu v Quake II RTX nekončí, zde se počítá také s nepřímým osvětlením (5), neboť i v reálném světě i nezrcadlové objekty pochopitelně světlo odrážejí, protože kdyby ne, jevily by se nám jako zcela černé a beztvaré.
Nepřímé světlo z dalšího náhodně vybraného lokálního zdroje (6) pak ovlivňuje výsledný odstín vykreslovaného předmětu, ale pochopitelně ne tak, jako ho přímou cestou ovlivňují zdroje světla. Přesto ale zdaleka nejde o zanedbatelný vliv, a to zvláště pokud se počítá s nepřímým osvětlením světla přicházejícího od slunce (7). Rozdíl si můžeme snadno představit, ostatně každý ví, jak vypadá světlo v místnosti za slunného dne a jak vypadá, když je pod mrakem. I v Quake II tak dostala místnost výrazný žlutý nádech.
srovnání scény bez nepřímého slunečního osvětlení (vlevo) a s ním (vpravo)
Sledování paprsků odraženého světla pak může být teoreticky opakováno dle libosti a čím vícekrát to uděláme, tím věrnější výsledek dostaneme. Jenomže to je pochopitelně i náročnější na výpočetní výkon, takže je důležité najít rovnováhu. Quake II RTX vysílá na pixel jednotky až maximálně desítky paprsků, což ovšem samo o sobě nestačí na to, aby byl vytvořen kvalitní obraz. Ve výsledku tu máme šumem silně poznamenanou scénu, která vyžaduje tzv. denoising, čili prostě odstranění šumu, neboť jinak bychom z výsledku ray tracingu moc spokojeni nebyli.
scéna před odstraněním šumu
Kdo by si však myslel, že k tomuto účelu se běžně využívají jádra Tensor, ten bude na omylu, neboť ve skutečnosti jde o práci spíše pro klasické shadery pomocí spacial a temporal filtering, čili Tensor se zapojí až v době, kdy ve hře zapneme DLSS.
Ukazuje na to i následující rozklad zapojení hardwaru v GeForce RTX při renderování jednoho snímku v Metro Exodus. Jeho vyhlazení nastoupí ihned poté, co svou práci dokončí jádra RT, zatímco Tensor se v případě využití DLSS zapojí až na konci.
Nicméně NVIDIA přesto nabízí možnost odstranění šumu pomocí trénované umělé inteligence a jader Tensor, a to v rámci svého API OptiX.
My se ale v tomto článku věnujeme především hře Quake II, takže jak je to v jejím případě? Nejdříve se můžeme podívat na srovnání toho, jak dlouho trvá vykreslit jeden snímek s využitím ray tracingu, a to nejdříve na GTX 1080 Ti generace Pascal, pak na RTX 2080 bez jader RT a nakonec na stejné kartě s jádry RT.
I bez jader RT je RTX 2080, kterou by šlo jinak srovnat s výkonem GTX 1080 Ti, výrazně rychlejší než Pascal, a to díky svým jádrům INT32, která předchozí generace postrádá, stejně jako nemá samotná RT a Tensor. Využití RT jader pak dokáže celkový čas vykreslení snímku srazit ještě na třetinu, ovšem co RTX 2080 během toho konkrétně dělá?
Po převodu geometrických dat do podoby vhodné pro zpracování pomocí ray tracingu následují 4 úlohy sledující postup popsaný výše. Jde tak postupně o primární paprsky, odrazy, lomy a přímé osvětlení a následně o nepřímé osvětlení s jedním a dvěma odrazy. Jasně je vidět také náročnost jednotlivých částí úloh pro RT jádra.
A pak právě nastupuje odstranění šumu a zde je také patrné, že se jádra Tensor do těchto úloh nezapojují a jde o temporal a spatial denoiser. Nakonec nastoupí postprocessing výsledného obrazu, pod což se obvykle skrývají efekty jako DoF (hloubka ostrosti), Motion Blur (rozmazání pohybem) a jiné.