Současné hry by se neobešly bez sestavování trojrozměrné scény. Za tímto procesem je ale celá řada technologií a složitých výpočtů. Pronikněte do tajů prostoru.
Správná volba materiálů
Právě zde dochází k finalizaci scény, post-processingu a dopočítání konkrétních vlastností pro každý obrazový bod. Jednou z nedílných součástí moderních her je také výpočet osvětlení pro každý pixel (per-pixel lightning), nikoli pouze pro vrcholy. Pixel shader je program, který kombinuje vstupní data o rasterizovaném modelu s texturami a sérií proměnných – požadavků na výsledný objekt. Pokud by neměl program v této fázi informace o geometrickém modelu, nebylo by možné vytvářet komplexní efekty, které ovlivňují více než jeden pixel.
Na rozdíl od vertex shaderů je ale spuštění pixel shaderu možné v některém z mezikroků také na dvourozměrný obraz. Volání pixel shaderu probíhá z fáze rasterizace pro každý obrazový bod, který je pokryt některým ze základních útvarů v modelu a současně nemá použití daného shaderu zakázáno.
Vyhlazování hran na bázi multisamplingu navyšuje rozlišení, a tedy zátěž systému, objekty pak ale působí přirozeněji, čemuž dopomůže také mírné rozostření hran
V tomto místě se může GPU postarat také o vyhlazení scény (multisampling) zvýšením počítaného rozlišení na hranách polygonů. Podle zvolené úrovně vyhlazování je každý pixel rozdělen na odpovídající počet subpixelů (několikanásobně tedy vzroste rozlišení obrazu), ale u těch pixelů, kde leží všechny subpixely uvnitř daného objektu, je počítána hodnota společně. Tím jsou spolehlivě detekovány hrany a fyzickým zmenšením vypočteného obrazu v násobném rozlišení dojde k jejich vyhlazení (MSAA resolve). Multisampling není vždy ideální způsob vyhlazování (anti-aliasingu), v závislosti na konfiguraci hry a aplikačním požadavkům může být zvolena i jiná cesta.
Už jen vykreslit
Hojně využívanou technikou je rovněž bump mapping, vytvoření iluze strukturovaného povrchu, který by bylo extrémně pracné vytvářet ručně v době modelování. Pixel shader provede podle zadání úpravu normály každého bodu a posune bod po hloubkové ose Z. Původní technika pochází z roku 1978 (Jim Blinn), dnes se však využívají komplikovanější systémy vylepšující konečný dojem. Rozdíl mezi bump mappingem a teselací je především v realističnosti. Zatímco teselace skutečně upravuje geometrický model a přidává mu detaily, bump mapping jen posouvá pixely scény. Rozdíly v kvalitě jsou nejvíce patrné při výpočtu osvětlení, objekty s teselací vrhají realistické stíny, což u rychlejšího bump mappingu není tak snadné.
Koule vlevo je model vstupující do pixel shaderů, uprostřed je vygenerovaná mapa struktury – čím tmavší bod, tím hlubší zářez, vpravo je finální produkt (zdroj: wikipedia.org)
Propracovali jsme se až na konec grafické pipeline, kde musí dojít ke spojení všech vypočtených hodnot a finalizaci scény (output-merge). Je důležité přesně určit, které pixely budou viditelné a mají být obarveny, a které nikoli. Částečně toho bylo docíleno ve fázi rasterizace, prostřednictvím pixel shaderů ale mohly být některé povrchy zprůhledněny (voda, dým) nebo mohly při náhodném generování povrchů vzniknout pixely i tam, kde si je nepřejeme mít. Pro tyto účely se využívají vyrovnávací paměti depth buffer a stencil buffer vstupující do finálního depth-stencil testu.
Pozvolna zplošťujeme
Depth buffer (vyrovnávací paměť hloubky, též z-buffer) nese informaci o vzdálenosti každého bodu od kamery. Ukládání tohoto údaje probíhá v době renderování. Pokud by mělo být ve dvourozměrném výstupu na jedno místo vykresleno více pixelů, dostane přednost ten nejblíže kameře. Ve finální scéně pak bližší objekty zakrývají ty vzdálenější – body navíc jsou zahozeny (z-culling). Stencil buffer nese informaci o masce, na jeho základě je určováno, do kterých bodů obrazu je možno zapisovat, a do kterých nikoli. Využití nachází třeba při generování stínů, zvýraznění obrysů apod.
V samém závěru nastupuje míchání barev (blending), podstatné zejména pro místa, kde se překrývá více pixelů a není možné žádný z nich zahodit. Blending neprobíhá plošně, některé pixely je možno jen propustit na základě údajů v z-bufferu. Výsledné pixely jsou ukládány do paměti a ve chvíli, kdy je snímek hotový, nezbývá, než jej odeslat na výstup.
Celý proces výpočtu scény pixel po pixelu je obdivuhodně rychlý, běžný monitor má více než 2 miliony bodů, pro plynulé hraní je zapotřebí aspoň 30 snímků za sekundu a počet generovaných bodů navyšují technologie jako multisampling nebo bump mapping. Ne nadarmo je grafická karta označována za nejsložitější komponentu počítače a její výkon je často využíván i pro jiné než herní výpočty.
Článek byl původně publikován v časopise Computer