Ray tracing ve World of Tanks: na všech GPU podporujících DirectX 11
Tato novinka je výsledkem spolupráce autorů hry Wargaming s Intelem, díky níž byla do Core Enginu používaného hrou přidána podpora pro ray tracingové efekty. Běží na API DirectX 11 a měla by alespoň teoreticky běhat na všech grafikách s podporou funkcí této generace (Tedy od Radeonů HD 5000 a Nvidia Fermi/GTX 400). Výpočty nevyužívají žádné speciální jednotky, jen normální shadery v GPU. Ve World of Tanks je tato implementace použitá k vykreslování realistických stínů, ovšem samotná infrastruktura by asi potenciálně mohla být použita i pro jiné efekty, a možná také pro jiné hry.
Ray tracing je jak už bylo řečeno využitý po vykreslování realistických stínů, ovšem ne pro všechny objekty, ale jen pro tanky. A to ty pohybující se, pro zničená vozidla nikoliv. A také se nepočítá pro vozidla, která nejsou ozářená přímým slunečním světlem. Tyto stíny by měly být kvalitnější, protože běžná rasterizace používá triky (shadow mapping), které způsobují různé artefakty, nerealistické chování a tyto klasicky počítané stíny nebyly vykreslovány na větší dálku (víc jak 100 metrů).
Vyzkoušet si můžete demo
Nová verze s možností používat ray tracing pro stíny by měla být uvolněna v blízké budoucnosti. Již teď (od včerejška) je však dána volně ke stažení samostatná demo aplikace či vlastně benchmark World of Tanks enCore RT, se kterou si můžete efekt vyzkoušet. Najdete ji zde (vyžaduje instalaci launcheru Wargaming.net Game Center).
V aplikaci lze kvalitu ray tracingu nastavit podobně jako další parametry (na vypnuto, high, maximum a ultra). Jen pozor na to, že česká lokalizace používá pro tuto volbu chybný mechanický překlad „stíny sledovaných paprsků“, zkráceně ale „RT“, což už dává smysl. Samotné demo pak není interaktivní, scéna slouží toliko k vyzkoušení výkonu počítače. Výsledek dostanete ne v FPS, ale jako skóre, kdy do 3000 je výkon neuspokojivý, 3000 až 8000 je dobré, 8000 až 10 000 skvělé a přes 10 000 má údajně zajišťovat, že zvolená nastavení nebudou způsobovat lagy nebo poklesy FPS.
V benchmarku/demu je tento efekt ray tracingových stínů volitelný a nebude zapnutý ve výchozím nastavení (a to ani pro detaily Ultra), stejně tak tomu bude i ve finální hře. Zapnout si ho bude moci každý volitelně (a posoudit, zda to nestojí příliš mnoho výkonu). V naší galerii si můžete prohlédnout snímky z tohoto dema v nastavení Ultra a pro srovnání bez ray tracingových stínů, obrázky jsou z nastavení Ultra/RT Ultra a konvertované do 4:4:4 JPEGu s 90% kvalitou.
Galerie: Demo ray tracingu ve World of Tanks: kvalita Ultra, RT On
Galerie: Demo ray tracingu ve World of Tanks: kvalita Ultra, RT Off
Jak ray tracing v World of Tanks funguje?
Pokud si připomenete princip fungování ray tracingu u grafik Nvidia Turing („Nvidia RTX“), tak je u něj použitý algoritmus Bounding Volume Hierarchy (BVH). Ten spočívá v tom, že každý objekt je vyplněn (respektive, je opsán) neviditelnými kvádrovými pomocnými objekty (boxy), které mají stromovou hierarchii – celý objekt je obalen jen několika málo velkými boxy, které jsou pak postupně dělené na menší a menší pod-kousky.
RT jádra grafik Turing dělají zejména jednu věc: vypočítávají, zda konkrétní paprsek ray tracingu prochází konkrétními z těchto pomocných kvádříků. Když je nalezen průsečík s prvním velkým boxem, jsou pak testovány jeho podboxy a v každé fázi se eliminuje část kandidátů díky oné stromové hierarchii. Až je nalezen box, který paprsek trefí, i na nejnižší úrovni, teprve se začne analyzovat reálná interakce s částí objektu scény, která se nachází uvnitř onoho pomocného boxu poslední úrovně.
Když je nalezen průsečík, tak práce RT jader končí, práci přebírají univerzální programovatelné shadery, které vypočítávají už samotné barvy výsledných pixelů pomocí ray tracingového algoritmu. Tento systém analýzy kolize paprsku s objektem je používán proto, aby GPU nemuselo na průsečík analyzovat každý z jednotlivých trojúhelníků modelu, který u tanku má mít typicky okolo 50 000 trojúhelníků. Pro jeden paprsek kreslící stín pak stačí okolo pár desítek testů kolize s boxy/trojúhelníky.
Stejná technika s Bounding Volume Hierarchy, ale na CPU
Tuto techniku s hierarchií bounding volume boxů přebírá i implementace ray tracingu ve World of Tanks. Ovšem místo aby se analyzování/hledání průsečíků s boxy v hierarchii provádělo pomocí RT jader, dělá ho jednoduše CPU. Když je hierarchie boxů a průsečík s objektem zanalyzována, je opět jako u Nvidie práce předána shaderům (stream procesorům) GPU, aby dopočítaly finální pixel na základě získaných informací. A analýza oné struktury BVH je místem, kde přichází na řadu Intel. War Gaming používá ray tracingový kód Intel Embree, který má optimalizovanou mnohovláknovou implementaci právě analýzy BVH. Proti původní neoptimalizované verzi, která potřebovala 8ms výpočtů na jeden snímek, je s Embree potřeba téměř zanedbatelný čas a navíc se dá výpočet dělat paralelně se samotným vykreslováním na GPU.
Počítání na CPU může vypadat jako špatný nápad, protože jak známo, má pro grafické operace GPU mnohem více výpočetního výkonu než obecné CPU. Ovšem je tu ta výhoda, že dnešní CPU s mnoha jádry nemusí být při hraní vytíženo, kdežto GPU typicky je a pokud byste shaderům přidali další práci, pak snížíte snímkovou frekvenci, na které hra poběží. CPU tedy má teoreticky méně výkonu, ale zase je do určité míry „zadarmo“. U World of Tanks tedy ray tracing takto využívá sílu CPU k velké části výpočtů a z hlediska využití GPU by to mělo být vcelku efektivní.
Denoising pro měkké stíny
Výpočet na CPU bude ale přirozeně mít menší výkon/kapacitu, takže tato technologie asi dovoluje použít na scéně menší množství ray tracingových efektů, než ray tracing s hardwarovými akcelerátory v GPU. Proto také je přítomnost ray tracingových stínů omezená, na jeden pixel je například používaný vždy jen jeden paprsek.
Aby stíny byly měkké s polostínem po okraji, jsou paprsky randomizované, což konturu, která by jinak byla ostrá, rozostří, ovšem vytvoří šum. Podobně jako v implementaci Nvidie je proto použitý ještě denoiser, který ostrý šum patřičně rozmaže/odšumí a vytvoří tak slušnou aproximaci měkkého stínu. Tento denoiser je spatio-temporální, tedy odšumuje průměrováním s okolními pixely, jakož i se „sousedy“ na stejné pozici z předchozího/následujícího snímku (tzv. temporální filtrování).