Hirdetés

Leképezők a játékokban (forward és deferred render)

A számítógépes grafika számítása során az egyik legfontosabb tényező az úgynevezett leképező (render). Ez a futószalag határozza meg az adott grafikus motorban, hogy a képszámítás pontosan hogyan is történjen. Régebben ez nagyon egyszerű volt, hiszen a VGA-k jórészt fixfunkciós egységekből álltak, de a shaderek bevezetésével, illetve a hardverek programozhatóságának fejlődésével egyre több alternatív út nyílt meg a fejlesztők előtt. A legnagyobb igény mindig is a fényforrások számának növelésére mutatkozott, hiszen a művészek így szabadabban dolgozhattak a játék dizájnján. A cél tehát egyszerűnek tűnik, de nagyon nem az, hiszen ott van a teljesítmény is, mint tényező.

A játékok igen sokáig az úgynevezett klasszikus forward leképezőt használták. Messze ez a legegyszerűbb és legkézenfekvőbb módja a képszámításnak, ráadásul jó kompatibilitást kínál a különböző effektekkel és felületekkel. A 2000-es évek elején azonban felmerült az igény a fényforrások számának extrém mértékű növelésére. Ez a klasszikus forward leképező esetében azért probléma, mert a működés szempontjából a rendszer minden fényforrásra leszámol minden objektumot, ami nagyfokú pazarlás. Kevés fényforrás és nem túl komplex modellek mellett bőven elfogadható, de a grafika fejlődése sok fényforrást és komplex objektumokat követel meg. Az árnyalás sem kedvező, mivel rengeteg olyan számítás történik, amire nem is lenne szükség. A klasszikus forward leképezőnek persze vannak olyan optimalizált változatai, melyek kevésbé pazarlóak. Ide sorolható a korai mélységteszt használata, mely megpróbálja még azelőtt meghatározni, hogy látszik-e az adott háromszög, mielőtt komolyabb számítások megkezdődnének. A cél természetesen a végső képi adatok szempontjából szükségtelen információk kivágása még a feldolgozás előtt. Ez segít a klasszikus forward leképezőnek, de az alapproblémát nem oldja meg.

A gondok felszámolására az ipar az úgynevezett klasszikus deferred leképezőt kínálta. Ez egy olyan szoftveres megoldás, mely a mélységpufferrel rendelkező grafikus vezérlőkön hatékonyabb feldolgozást kreál. Lényege, hogy a leképzés több fázisban történik. Először csak a geometria kerül kiszámításra a fényforrások figyelembevétele nélkül, amiből egy mélységpuffert nyer a rendszer. A második fázis újra leképzi a geometriát, de most már a fényforrásokkal, a shaderekkel és a textúrákkal együtt, ugyanakkor csak azok a pixelek kerülnek kiírásra, amelyeknél a Z érték megegyezik azzal a paraméterrel, amit az előzőleg létrehozott mélységpuffer tárol. A klasszikus deferred leképező hatalmas előnye, hogy az árnyalás nem végez felesleges munkát, illetve nagyságrendekkel több fényforrást lehet hatékonyan kezelni a klasszikus forward leképezőhöz viszonyítva. Komoly hátrány viszont, hogy a deferred leképezők gyenge kompatibilitást kínálnak a különböző effektekhez és felületekhez. Ide tartozik, hogy a rendszer nem támogatja a legkedveltebb élsimítást, azaz a hardveres MSAA-t (erre külön szoftveres megoldás kell), az átlátszó felületekkel nem működik jól (ezt kezelnie kell a fejlesztőnek), illetve a felületi variációk is limitáltak.

A klasszikus deferred leképezőnek is születtek alternatív változatai, ugyanis a klasszikus forward leképezőhöz képest jóval nagyobb memóriaigénnyel rendelkezett, továbbá a hardverek memória-sávszélességét sem kímélte. A két legelterjedtebb opció a teljes és a részleges deferred leképező. Mindkettő a memória-sávszélesség kímélésére utazott, így a felületi variációk további limitációkat szenvedtek, de cserébe csökkent a memóriaigény. A teljes és a részleges deferred leképező rendre 96 és 64 bit/pixel információt enged meg, így könnyen kitalálható, hogy előbbi jobb minőséget kínálhat, míg utóbbi jobban kíméli a memória-sávszélességet. Gyakorlatilag a fejlesztők számára adott a választás lehetősége, ami jó dolog, de páran nem elégedtek meg ennyivel.

A deferred leképezők alapvetően jól működtek, de 2010 körül egyre nagyobb igény mutatkozott a komplex felületek létrehozására, aminek a limitált felületi variációk nem kedveztek. Ráadásul a VGA-k memória-sávszélessége sem növekedett már olyan ütemben, mint az előző évtized közepén. Ez tipikusan egy olyan helyzet, amikor úgy kell megetetni a kecskét, hogy a káposzta is megmaradjon. A kutatások eredménye a mozaikos deferred leképező lett, ami DirectX 11-ben bemutatott compute shadert használta fel olyan célra, hogy nagymértékben csökkenjen a memória terhelése miközben az eddigi deferred leképezőknél sokkal több információ lesz tárolható pixelenként, illetve az eddigieknél is több fényforrás lesz kezelhető hatékonyan. Az alapötlet, hogy a teljes képkockát mozaikokra kell osztani, és a feldolgozást ezeken belül kell végrehajtani. Sajnos ezzel a deferred implementációval is gond a hardveres MSAA működése és az átlátszó felületek kezelése.

A mozaikos deferred leképező beindította a programozók fantáziáját is, és többen megpróbálkoztak egy mozaikos forward leképező megalkotásával. Ennek az alapötlete gyakorlatilag megegyező, vagyis a teljes képkockát mozaikokra kell osztani, és a feldolgozást ezeken belül kell végrehajtani. A cél ugyanakkor a forward leképezővel nem a memória-sávszélesség kímélése, hanem a rengeteg fényforrás hatékony kezelése. A legismertebb implementáció az úgynevezett forward+ leképező, mely közel annyi fényforrást kezel hatékonyan, mint a deferred leképezők, de eközben nem limitálja a felületi variációkat, tökéletesen kompatibilis a hardveres MSAA-val és azok extra szűrőivel, illetve az átlátszó felületekkel sincs különösebb gondja.

A mozaikos deferred és forward leképezők összehasonlítása 4 és 5 render target mellett A mozaikos deferred és forward leképezők összehasonlítása 4 és 5 render target mellett
A mozaikos deferred és forward leképezők összehasonlítása 4 és 5 render target mellett

A mozaikos deferred és forward leképezők összehasonlítása 4xMSAA nélkül és mellett A mozaikos deferred és forward leképezők összehasonlítása 4xMSAA nélkül és mellett
A mozaikos deferred és forward leképezők összehasonlítása 4xMSAA nélkül és mellett

A jövő szempontjából a compute shaderrel gyorsított mozaikos deferred és forward leképezők kerülnek majd előtérbe, mivel sokkal hatékonyabban dolgoznak, mint a korábbi megoldások, továbbá a DirectX 11-es hardverek is nagyon elterjedtek már. Arról még megy a vita, hogy melyik a jobb opció. Igazából mindkettőnek vannak előnyei. A mozaikos deferred leképezőt akkor érdemes választani, ha a játék extrém sok poligont használ és 1500 fényforrásnál többre tartanak igényt a művészek. A mozaikos forward leképező kevesebb poligonszám és kevesebb fényforrás mellett mutat fel jobb eredményeket, de ha fontos az átlátszó felületek egyszerű kezelése, a hardveres MSAA támogatása, illetve ha nagyon komplex felületeket szeretnének kreálni a művészek, akkor a poligonok és a fényforrások számától függetlenül is a mozaikos forward leképező adja majd a legjobb teljesítményt.

Hirdetés