Egy játék világát minél valósághűbben leképezni nem éppen egyszerű feladat. A valóságban nagyjából úgy látjuk magunk körül a világot, hogy a fényforrásokból végtelen mennyiségű foton áramlik szét a környezetre, amik aztán különböző objektumokkal találkozva részben visszaverődnek, részben vagy egészben pedig elnyelődnek. Mindez az adott dolog molekuláris felépítésétől függ.
Ezt a fajta végtelenséget persze szimulálni nem lehet, és még megközelíteni is nagyon nehéz, főleg akkor, ha valós időben, mondjuk egy videojátékban szeretnénk valami hasonlót elérni.
Éppen ezért a játékfejlesztők nem is igazán próbálkoztak vele, hanem az évtizedek során alternatív módszereket dolgoztak ki. Ezek elég meggyőzőek ahhoz, hogy "átverjék" a játékos szemét, de végső soron akkor is csak egy átverésről, utánzásról beszélünk, ami a valóságot próbálja meg egyfajta bűvésztrükként eladni.
Ezt a folyamatot nevezzük raszterizációnak, aminek a kiindulási alapját nem az objektumok, a felületek és a fotonok adják, hanem a polygonok, vagyis az objektumokat alkotó háromszögek, amiből a raszterizáció során végül 2D-s képkockák formájában megkapjuk a végeredményt a monitorunkon. Azonban a végső kép csak a "valóság illúziója", ahol minden felületre shaderek kerülnek az objektum anyaga alapján, és egy csomó kiegészítő technológiával próbálnak meg a fejlesztők "mélységet" és "részletességet" adni a képnek, illetve próbálják meg minél hatékonyabban és finomabban megvalósítani az árnyékokat és tükröződéseket, utánozni a fény viselkedését. Itt jönnek be az olyan misztikus dolgok, mint a shadow mapok, tesszelláció, ambient occlusion, screen space reflections és társai.
Metro Exodus ki- és bekapcsolt RTX-effektekkel
Alapvetően ez megfelelő eredményt hoz, és a modern GPU-kon rendkívül gyorsan működik, de mivel mégiscsak szemfényvesztésről van szó, számos hiányossággal bír. Nehéz kezelni a dinamikus fényforrásokat és azok hatásait a környezetre, a tükröződések sok esetben csak a képernyőn látható dolgokat veszik figyelembe, a fény nem úgy "terjed" és verődik vissza, ahogy kellene neki, és a különböző felületek bevilágítása is csak egy bizonyos szintig működik (például, ahogy az emberi bőr részben elnyeli, részben visszaveri a fényt).
Szó szerint képbe jön a sugárkövetés
A ray-tracing, vagyis a sugárkövetés nem egy új dolog. A filmes CGI effektusokhoz vagy éppen teljesen CGI-filmekhez (például Pixar) már régóta használják, hiszen ezzel lehet igazán közel kerülni ahhoz, ahogy a fény a valóságban terjed, és ahogy a valóság megjelenik előttünk.
A sugárkövetés alapvető lényege, hogy a jelenetben található minden egyes fényforrásból egy véletlenszerű (nagy) mennyiségű sugarat lövünk és követjük az útját, amint nekiütközik különböző felületeknek, majd elnyelődik vagy visszaverődik azokról. Fontos követni azt is, hogy milyen szögben csapódik neki a felületnek, milyen anyaggal találkozik, hiszen ettől például megváltozhat a visszavert fény színe, amit tovább kell követni, ismét csak több sugárral. Ezt a folyamatot addig kell csinálni, amíg a sugár el nem hagyja a jelenetet és nincs többé rá szükség.
Ez persze kiváló eredményt ad, csak éppen rendkívül pazarló, ugyanis a legtöbb kilőtt sugár semmi olyannal nem találkozik, ami a (videojátékoknál maradva) a játékos számára érdekes lenne.
Így a gyakorlati megvalósításban a dolog úgy történik, hogy az egész folyamatot megfordítják, és a játékos szemszögéből, vagyis a kamerából lövik ki a sugarakat, amik fordított utat járnak be, így csak azokat a sugarakat kell követni, amik ténylegesen hozzátesznek valamit az adott jelenethez. Ezek aztán szépen elpattognak egy képernyőn, és elérnek egy fényforráshoz, vagy elhagyják a képet.
És akkor ezen a ponton jutunk el odáig, hogy a DirectX 12 DXR kiegészítésével a sugárkövetés ilyen szinten történő megvalósítása szabványosítottan rendelkezésre áll. Ez azt jelenti, hogy a GPU ki tudja számolni az ehhez szükséges műveleteket akár a hagyományos stream processzorokon is a compute shaderek segítségével. Azonban könnyű belátni, hogy ez rendkívül teljesítményigényes feladat, és ebben a formában nagyon nagy FPS-veszteséggel járna.
Itt jönnek képbe a GeForce RTX GPU-k shader moduljaihoz szorosan kapcsolódó RT-magok, melyeket kifejezetten a sugárkövetés különböző feladatainak hardveres gyorsítására épített be az Nvidia. Ezek három alapvető módon tudják segíteni a ray-tracing hatékony alkalmazását a játékokban.
Az egyik, amiről talán kevesebbet beszélünk, az a zajszűrés. A sugárkövetés számításigénye jelentősen csökkenthető azzal, ha minél kevesebb sugarat kell kiküldenünk a kamerából. Habár számos nagyon optimalizált eljárás létezik arra, hogy a jelenet szempontjából a legfontosabb sugarak "kimenjenek", még így sem lehet (vagy érdemes) eleget kiküldeni ahhoz, hogy hibák nélkül összeálljon a kép. Így a végeredmény "zajos" lesz, amit az RTX képes egy eljárással kitisztítani, így jóval kevesebb erőforrás felhasználásával (kevesebb sugárral) tudja összerakni a végleges képet.
Ezen kívül az RT-magok kibocsátott sugarak ütközéseinek kalkulálását gyorsítják, ám az egész alapvetően egy Bounding Volume Hierarchy Traversal (BVH) nevű algoritmusra épül, ami az RTX specialitása.
A lényeg itt is a hatékonyság növelése, vagyis hogy pontosan lehessen tudni, milyen háromszögekkel fog találkozni a kibocsátott fénysugár a játéktérben. Márpedig nem nehéz belátni, hogy egy modern játékban egy jelenetben több ezer objektumot, így potenciálisan több millió háromszöget találunk, amik közül meg kéne találni, hogy mi fontos a sugár szempontjából. Ez rendkívül teljesítményigényes lenne, ám itt jön képbe a BVH.
Ezt úgy kell elképzelni, hogy adott egy objektum, ami legyen jelen esetben mondjuk egy nyuszika, mert az Nvidia is ezzel igyekezett bemutatni az eljárást. A BVH lényege, hogy lépcsőzetesen halad: első körben az egész nyuszi körül van egy "doboz". Ha a kibocsátott sugár egyáltalán nem találja el a dobozt, akkor a nyuszival egyáltalán nem is kell foglalkozni. Ha a sugár eltalálja a dobozt, akkor a BVH algoritmus további kisebb dobozokra bontja az előzőt, mondjuk a nyuszi különböző testrészeire, majd ezt megismétli még néhányszor, amíg egy elég kis dobozt nem kap ahhoz, hogy meg tudja határozni, melyik háromszögekkel kellene találkoznia egy kibocsátott sugárnak.
Ezt az egész folyamatot a GeForce RTX-be épített RT-magok körülbelül tízszer gyorsabban végzik el, mint a mezei CUDA-magok, a CPU-khoz pedig nem is nagyon érdemes viszonyítani, azokon egy modern, komplex játék esetében vállalhatatlanul lassan futna le az egész.
Így tehát a sugárkövetés alkalmazása ténylegesen lehetségessé válik a játékokban, azonban meg kell jegyezni, hogy még az ilyen hardveres képességekkel sem reális, hogy egy modern és komplex AAA-kategóriás játék teljes egészében sugárkövetésre épüljön. Egyszerűen túl nagy kompromisszumokat kellene hozni a jelenet összetettsége és a sebesség oltárán, éppen ezért jelenleg a fejlesztők többsége hibrid megoldást használ. Ennél a kép egy részét hagyományos raszterizáció útján képzik le, és ott vetik be a sugárkövetést, ahol igazán látványos eredményt produkál, például tükröződésekhez, árnyékokhoz, belső terek teljesen globális és dinamikus bevilágításához, és hasonlók.