Grafická pipeline: jak se tvoří obraz II
23.2.2015, Pavel Šantrůček, článek
Minule jsme si ukázali, jak nám grafická pipeline vůbec vzniká. Naší poslední zastávkou byl KMD (Kernel Mode Driver) a dnes se porozhlédneme, jak se to vlastně všechno v grafické kartě umele tak, abychom scénu z naší hry uviděli na monitoru počítače.
Kapitoly článku:
Rasterizace
Rasterizace je proces, v kterém se objekty umístěné v našem 3D prostoru převádějí (promítají) do ploché rastrové mřížky tak, aby mohly být později zobrazeny na plochém displeji monitoru. Tento proces má několik fází a samotný výkon grafické karty zde hraje opravdu významnou úlohu.
Proces rasterizace by se dal popsat nejjednodušeji asi takto. Primitivní tvar (jako je trojúhelník), který je umístěn v 3D prostoru, se pomocí interpolace promítne do rastrové mřížky.
Po této interpolaci budeme vědět, které body (pixely) rastrové mřížky náš trojúhelník obsadil. Co ale vědět nebudeme, je to, jakou barvu máme každému z těchto pixelů nastavit. V dalším kroku tedy musíme nějak určit barvu pro každý konkrétní pixel rastrové mřížky, který náš trojúhelník obsadil.
Při převodu vektorových objektů na rastrové vzniká ještě další problém, kterým je ztráta jednoho rozměru 3D prostoru, tedy vzdálenosti objektu od kamery. Až budeme rasterizovat další trojúhelník, musíme vědět, jestli tento trojúhelník v rastrové mřížce překrývá či nepřekrývá nějaký jiný (už dříve rasterizovaný) trojúhelník. Z tohoto důvodu se informace o hloubce pixelu (vzdálenosti od kamery, nebo také „Z“ rozměru) ukládá při rasterizaci do speciálního úložiště s názvem Z-buffer.
Z- buffer tedy obsahuje pro každý pixel rastru jeho hodnotu vzdálenosti od pozorovatele (kamery). Na obrázku jsou tyto hodnoty reprezentovány stupněm šedi, kdy ke kameře bližší pixely mají barvu světlejší a vzdálenější barvu tmavší.
Dalším a docela nepříjemným jevem rasterizace je pak vznik zubatých hran (Jagged Edges).
Velikost zubatých hran (Jaggies) je přímo úměrná hustotě rastrové mřížky, která představuje rozlišení, do kterého je 3D objekt rasterizován. Zvolíme-li tedy ve hře rozlišení vyšší, „jaggies“ budou samozřejmě menší, ale grafická karta se zase bude muset postarat celkově o mnohem více pixelů. O tyto hrany se tedy budeme muset postarat ještě nějakým jiným a méně náročným způsobem později (anti-aliasing).
Takovýmto způsobem tedy probíhá rasterizace a my se nyní můžeme vrátit zpět k našemu potrubí a podívat se, jak je celý tento proces realizován přímo na grafické kartě.
Rasterizer (RA)
Rasterizér je fixní jednotkou potrubí, ve které se provádí interpolace trojúhelníku do rastrové mřížky. V první řadě si rasterizér zjistí, zda trojúhelník bude vůbec v daném rastru viditelný. Mohlo by se stát, že by náš trojúhelník mohl být umístěn úplně mimo požadovaný rastr a pokud bychom ho rasterizovali, byla by to samozřejmě naprosto zbytečná práce. Také tu máme trojúhelníky, které jsou umístěny ve spodní (neviditelné) straně objektu (třeba zadní strana krychle), takže opět nemá cenu se jimi vůbec zabývat. Takovému vylučování objektů z procesu rasterizace se říká Clipping nebo Culling.
Pokud je tedy rasterizér přesvědčen o tom, že bude daný trojúhelník viditelný, provede rasterizaci – tedy promítnutí trojúhelníku do rastrové mřížky, aby zjistil, které pixely tam budou tímto trojúhelníkem obsazeny. Nyní už zbývá „pouze“ zjistit, jakou barvu budou tyto obsazené pixely mít a právě tímto úkolem je pověřena další zastávka našeho potrubí s názvem Pixel Shader.