Azt, hogy az adott virtuális világból miként lesz pixelgrafikus kép azt a render pipeline (magyarul néha csővezeték) határozza meg. Ez egy összetett erősen párhuzamosított algoritmus ami általában több elkülöníthető lépésből épül fel. Ezért is nevezzük, pipeline-nak vagy csővezetéknek, mert az adatok “végigcsorognak” ezen a folyamaton, ami végén egy pixelgrafikus képet kapunk.
Azt a folyamatot, amikor egy számítógépes modellről vagy jelenetről egy virtuális kamera pixelgrafikus vagy más néven rasztergrafikus képet készít, renderelésnek vagy képszintézisnek nevezzük.
Ha a képeket folytonosan meg is jelenítjük gyors egymásutánban, akár egy filmet, valós idejű vagy “real-time” renderelésről beszélünk.
A következőkben a raszterizációs renderelés pipeline-ját vizsgáljuk meg. Egyéb 3D-s render technikákról itt olvashatsz: Renderelési stratégiák
A raszterizációs renderelés folyamata
A pipeline felbontható szeparált lépésekre. Minden lépésnek van egy megfelelő típusú bemenete, ezen a bemeneten végez valami műveletet és kiad magából egy módosított adatot. A legelső lépés bemenet a játék világ információi lesznek és a végső kiment pedig a képernyőn megjelenített kép.
Ezen lépések nagy része a modern renderpipeline-okban manipulálható, programozható a fejlesztő igényei szerint. Ezeket a kiegészítő programokat, amik a renderelés közben a videokártyán, vagy más néven GPU-n futnak le shader-eknek nevezzük.
A renderelés folyamata legtöbbször a következő lépésekre bontható:
A. Culling (selejtezés)
A látható objektumok összeválogatása a nem megjelenítendő modellek “kiselejtezésével”. Ezen lépésben szükséges számítások nagy részét még a processzor végzi el.
- Frustum culling: Azon objektumok összeválogatása, amik a kamera látóterén belül vannak.
- Occlusion culling: Egy újabb szűrés, ami a más modellek által kitakart objektumokat selejtezi ki.
B. Renderelés (Képszintézis)
Ez a magja a render pipeline-nak. Ez dönti el, hogy a megjelenítendő objektumok mi módon lesznek kirajzolva. Ez a folyamat is felbontható kisebb lépésekre:
- Camera transformation - Kamera transzformáció
- Vertex shading
- Triangle Assembly - Háromszögesítés
- Tesselation & Geometry shading - Tesszalláció és a geometriai módosítása
- Rasteriastion & Cropping - Raszterizáció és vágás
- Fragment (pixel) shading
- Testing & Culling - Tesztelés és keverés
A térbeli modellek áttranszformálása kameratérbe
Ezen folyamat során a tér modellek és azok minden vertexe a kamera koordinátarendszerébe kerül áttranszformálásra. Ez a koordinátarendszer különbözik a 3D-s tértől, amiben dolgozunk. Helyette az X és Y koordináták az fogják meghatározni, hogy egy adott pont a képernyő melyik pontján fog megjelenni a vízszintes és a függőleges tengely mentén. A Z koordinátát pedig a kamerától való távolság határozza majd meg.
A fejlesztő által is írható program lefutása, ami fényelési, textúrázási és egyéb információkat számol ki minden egyes vertexhez.
A vertexekből 3 háromszögeket állít össze.
Opcionális lépés, ami a háromszögeket felbontja kisebbekre vagy egy shader programmal módosítja őket.
A pixelek és hozzá szükséges adatok létrehozása a hároszögekből. A képrnyőn kívül eső pixeleket eldobjuk.
A fejlesztő által is írható program lefutása, ami az egyes pixelek színét állapítja meg a vertex információk, textúrák és egyéb elérhető információk alapján.
Tesztelés esetén eldobjuk objektumok azon pixeleit, amiket kamerához közelebbi pixelek eltakarnak. Ha átlátszó materiálok is szerepelnek a képen akkor a pixeleket nem feltétlenül eldobjuk, hanem keverjük egymással.
C. Post Processing (Utólagos képfeldolgozás)
A renderelés utáni rasztergrafikus kép pixel szintű módosítása. Ezt a műveletet a post-processing shader program végzi. Ezen a ponton már nem egyedileg lépegetünk végig az objektumokon, csupán a lerenderelt képet manipuláljuk ahhoz hasonlóan, ahogy azt egy képszerkesztő szoftverben tehetnénk. Bővebben.: Prost Processing (Hamarosan)
A pipeline több ponton erősen párhozamosítható. Például különböző vertexek vagy pixelek feldolgozása futhat egymás mellett is. Ezért is a renderelés számításának nagy része a videokártyán fog futni, ami egy erősen párhuzamos számítóeszköz, ellentétben a processzorral.
A raszterizáció hátránya
Mint azt a Renderelési stratégiák leckében tárgyaltuk, a raszterizációval elvesztünk olyan fizikai jelenségeket, mint árnyékok, tükröződés, fénytörés, fényvérzés, és valószerű ambiens árnyalás.
Mivel mindezek nélkül nehezen lehet elképzelni realisztikus látványt, ha a valósághűség a célunk elmés szoftveres trükkökkel vissza kell “csalni” az említett jelenségeket a raszterizációs munkafolyamatba. Hogy ez miként zajlik, azzal későbbi fejezetek foglalkoznak:
Unity Pipeline-ok
Különböző Pipeline-ok különböző grafikai funkciókat nyújtanak különböző minőségben és számítási igénnyel.
A Unity játékmotorban létezik többféle render pipeline. Ezek közül a fejlesztők kiválaszthatják sőt felprogramozhatják a játékaik megjelenítéséhez a legmegfelelőbbet. Ez a megoldás egy elég komoly innováció. A Unity az első engine, ami ilyen szintű befolyásolást enged a renderejéhez.
A Unity legrégibb és alapértelmezett render pipeline-ja a Core Render Pipeline, amely biztosítja az olyan alapvető megjelenítési funkciókat, mint például árnyalások, világítás és árnyékok. A Core render pipeline funkcionalitása is eléggé kiterjedt, de valamennyire korlátozott, ezért vezette be a Unity-a a Scriptable Render Pipeline-okat, röviden SRP.
Az SRP funkció lehetővé teszi, hogy mindenki magának készítsen Render Pipeline-t Unity-ben, ez azonban igen nagy szakértelmet és erőfeszítést jelent ezért eléggé ritka. Általában a három Unity által biztosított pipeline közül választanak a fejlesztők:
- Core / Legacy Render Pipeline
- Universal Render Pipeline: URP
- High Definition Render Pipeline: HDRP
Core vs. URP vs. HDRP
A fejlesztők a Core Pipeline-hoz képest több kontrollt és szabadságot kapnak a másik két lehetőséggel, a URP-vel és a HDRP-vel. Ezen renderer-ek újabbak, szélesebb funkcionalitásúak, optimalizáltabbak és lehetővé teszik a magasabb minőségű képmegjelenítést.
Mikor használd a Core Render Pipelinet?
Ha kezdő vagy és most tanulod a játék-fejelsztést.
Kevesebb funkciója van mint az URP-nek és a HDRP-nek, de cserébe jóval egyszerűbb.
Mikor használd az Universal Render Pipeline-t?
Ha van némi tapasztalatod a Unity-vel akkor az URP legyen mindig az alapértelmezett választásod főleg ha a játék vizuálisan nem kifejezetten realisztikus.
Ha kiadásra tervezed a játékot akkor érdemes lehet URP-t használni. Ha nem vagy biztos ebben, ne aggódj. Kezdheted a projekt Core-ban és később is lehet váltani másik Pipeline-ra közt.
Mikor használd az High Definition Render Pipeline-t?
Csak akkor állj neki a HDRP projektnek, ha már tapasztalt fejlesztőnek érzed magad és nagy grafikai számításigényű, 3D játékot készítetek.
Ha 2D játékot készítesz, NE használj HDRP-t.
Nagy grafikai számításigényű, 3D játékokhoz használatos a HDRP.
Kizárólag PC-re, PlayStation-re és X-BOX platformokra.
Ha mobil, vagy a Nintendo Switch konzolokra szeretnél kiadni a játékot NE használj HDRP-t.
Valószínűleg nem érdemes egyedül nekiállnod egy HDRP projektnek, legalább legyetek 4-5-en a csapatban.
Core | URP | HDRP | |
Kezdő-barát | ✅ | 🚫 | 🚫 |
WebGL, Android, iOS, Nintendo Switch Build | ✅ | ✅ | 🚫 |
Fejlettebb 2D renderelés: (Fények, árnyékok, …) | 🚫 | ✅ | 🚫 |
VFX Graph (A Particle System fejlettebb verziója) | 🚫 | ✅ | ✅ |
Shader Batching (Teljesítmény javító eljárás) | 🚫 | ✅ | ✅ |
Beépített Post process effektek | 🚫 | ✅ | ✅ |
Fejlettebb 3D renderelés: (Ray Tracing, Path Tracing, …) | 🚫 | 🚫 | ✅ |
A döntéshozásról bővebben itt olvashatsz: