Jak pracuje grafická karta - základy 3D | Kapitola 3
Upravená verze: Nové grafické čipy už obsahují více tranzistorů (GeForce 7800 obsahuje 302mil. tranzistorů) než poslední super-duper 64-bitové procesory a ne vždy je zřejmé, co tyto kvanta tranzistorů vlastně dělají. Jak vlastně vzniká 3D scéna, které kroky musí proběhnout a co se při nich v grafické kartě děje? Pokud chcete pochopit základní otázky spojené s 3D renderingem, pak je tento článek určený právě pro vás.
Triangle setup
Po transformaci scény následuje tzv. Triangle Setup (v této fázi jsou polygony již virtuálně osvíceny a vystínovány). Jedná se o rozklad obrazu na trojúhelníky ležící již v ploše obrazu. Jedná se tedy o obraz jakoby zachycený na plochém filmu, přičemž vrcholy trojúhelníků nesou stále informace potřebné pro úspěšné aplikování pixelových operací - informace o poloze, intenzitě a jasu... Stínování povrchu je dáno právě intenzitou stínu jednotlivých vertexů.
Práce texturovací jednotky
Pod pojmem textura rozumíme dvourozměrný obrázek, který je určen k potahování předmětů a vytváření jejich reálného vzhledu. Vstupem do Texturovací části grafického pochodu je transformovaný a na trojúhelníky rozdělený osvícení a nastínovaný objekt (zpravidla ve stupních šedi, či v některém základních barevných tónů - RGB).
Textura tudíž slouží jako tapeta, vzor povrchu, kterým se daný předmět potáhne (a může se jednat klidně o poloprůhlednou texturu vody, či kouře a nejen o klasickou představu cihlové zdi).
Projekce scény je rozdělena na logické trojúhelníky (vlevo)
jež se texturují dle daného schématu do konečné podoby (vpravo).
V 95% případů nestačí klasická jedna textura jako mapa, reprezentující povrch objektu. Při zobrazení např. stínového přechodu se na texturu umísťují další a další vrstvy poloprůhledných textur (LightMap), které dávají objektu světelně přechodový vzhled (viz. kapitola o stínování). Problematické jsou vždy poloprůhledné a nesouvislé textury jako je kouř, voda, sklo, atd. V jednom cyklu tak vyvstává nutnost nanést až několik textur najednou, např. Textura + Průhledná textura + odrazová textura, atd. Obecně jsou na jednom pixelu navršeny až tři textury, při texturování složitějších částí jako již zmiňovaná voda může počet vrstev 6 i více.
Čím více dokáže grafická karta v jednom cyklu nanést textur na pixel (Multitexturing), tím je větší pravděpodobnost, že celá operace texturování pixelu bude zvládnuta v tom samém cyklu. |
Práce Pixel Shaderů
Pixel Shader je druhá základní část nových rozšířeních DirectX8 a dokáže manipulovat s objekty nejen ve fází texturování, ale už i podstatně dříve při samotném transformování scény. Stejně jako Vertex Shader (s kterým je v neustálém kontaktu a výpočty a předdefinované funkce sdílejí, či si je efektivně předávají) i Pixel Shader pracuje souběžně s texturovací jednotkou, je plně programovatelný a jeho obohacení spočívá v dílčích zásazích při texturování povrchu složitých objektů a následných odrazových a světlo-lámajících efektech.
Velká část usnadnění spočívá právě v onom multitexturingu, kdy si např. při zobrazení vodní hladiny nemusí texturovací jednotka vršit 6 textur, ale Pixel Shader jí nabídne podprogram jako Voda1, Voda1 v noci, Voda1 při bodovém světle, Voda 2, atd.., který se pak už jednoduše dotexturuje jednou, dvěmi poloprůhlednými stínovými texturami a hotovo. Mezi další vlastnosti Pixel Shaderu patří práce nad texturami jako :
- usnadnění Phongova stínování,
- mapování nerovností povrchu (Dot3 Bump mapping, Envirometnal Bump mapping)
- Odrazové efekty - Difrakce a Refrakce světla, Fresnelův efekt, Cookovo osvětlení
- Texturování kůže, vlasů, chlupů,
- Komiksové texturování - Cartoon texturing,
Příklady
Phongův model osvětlení (per-Pixel Shading)
Cook&Torrencův model osvětlení (pro kovové povrchy)
Fresnelův efekt - lom světla přes vydutou čočku
Difrakční efekt - lom světla přes čirý krystal, matné sklo, popř. led (využito hojně u Half Life 2)
Nahoře je klasické texturování, dole texturování s Pixel Shaderem (srst).
Cartoon rendering - z reálné scény obrazu se vytváří komiksová karikatura
Instrukční sada Vertex a Pixel Shaderů patří mezi zásadní zlom v programování grafických pochodů, neboť neuvěřitelně usnadňuje programátorům a grafikům práci. Díky ní je tak možné zvládnout práci, která by trvala týden za jediný den a v ještě vyšší kvalitě. Bez grafických karet s podporou Shaderů se v nejbližší době některé hry neobejdou vůbec, u některých her pak bez Shaderů bude trpět kvalita obrazu, protože kdo jednou viděl technologické demo nVidia s rozbouřenou mořskou hladinou s blesky a pěnou na vodní hladině, nechce už jinak. |
Renderovací jednotka
Do této části spadají konečné úpravy scény - mapování textur, alfa-test, stencil-test, Z-test (znovuodstraňování nepotřebných informacích o neviditelných pixelech), Anti-aliasing (vyhlazování) a samotný rendering (vykreslování)
O funkci Visibility subsystemu bylo již pojednáno výše. Znovu tedy připomeňme, že tato část grafické logiky se stará o sumarizaci dat o dále nepotřebných pixelech, které v průběhu pochodu 3D jádrem vypadnou, nebo nejsou v závislosti na perspektivě scény viditelné. Tento podsystém umí zasahovat do grafických výpočtů již od samotné geometrické transformace a jakmile je predikován pixel, který ve finální části nebude zobrazen - pryč s ním.
Predikce nebývá sice vždy správná, zejména jedná-li se později o multitexturing složitého povrchu, ale 80-90% "označených pixelů" je vyřazeno oprávněně (jedná se o zásadní optimalizaci grafického pochodu, neb grafické jádro nemusí zpracovávat povrchy které ve výsledném zobrazení nebudou vidět).
Klasický výpočet viditelnosti (Z-buffer)
Zobrazované objekty - čáry, trojúhelníky a body se rozdělí na jednotlivé pixely a pro každý pixel se určí jeho viditelnost samostatně - porovnává se "vzdálenost" pixelu s informacemi uloženými v tzv. Z-bufferu a provádí tzv. test hloubky: Z-Test. Dojde-li systém k závěru, že pixel bude v 3D scéně překreslen, vyřadí ho. Současné nejnovější trendy hovoří o tzv. Deferred rendering, tedy metodice, která přímo zakazuje do pixelového průchodu pouštět ve finální fázi nezobrazené pixely. Obvyklé problémy nastávají s klasickými případy poloprůhledných objektů -> k překreslení dochází tady vždy, je však nutno ho co nejvíce eliminovat.
Mapování textur, filtrování
Filtrování se provádí má za úkol dostát hladké návaznosti z textury na texturu. Tuto návaznost není složité dopočítávat uvnitř souvislé plochy, problém nastává s texturami na rozhraní (přechod z horizontu na oblohu, animace vesmírné lodě na tmavém pozadí poseté hvězdami..).
Filtrování (mapování textur) se liší dle počtu stupňů - Bilineární, Trilineární a Anizotropické. Na slabších kartách postačí filtrování bilineární, od GeForce3 a výše můžeme bez razantnější ztráty rychlosti renderingu použít filtrování trilineární, nejsložitější anizotropické pak nabízí nejlepší vizuální dojem bez ztráty výkonu jen na silných grafických kartách typu Radeon 9700 a výše (pozn. je nejlépe nastavit 8xAF, jelikož rozdíl oproti 16xAF je stěží viditelný). Dále se není třeba bát použití tzv. brilineárního filtrování (optimalizovaného), které poskytuje srovnatelnou kvalitu s klasickým trilineárním, ale toto platí jen pro hry, protože pro profi aplikace je stále potřeba použít filtrování bez optimalizací (bez artefaktů a zkreslení). |
AntiAliasing
K vyhlazení zubatých hran na rozhraní dvou nespojitých zobrazení (aliasingu) se používá tzv. vyhlazovací filtrování: Anti-Aliasing (AA). Ošklivé zubaté hrany byly vždy problém a o metodách jejich vyhlazování se vědělo už dříve, ale zátěž na výkon grafické karty byla tak vysoká, že bylo nejprve potřeba aby dospěl samotný hardware. Dnes, s kartami jako Radeon X800 či GeForce 6800 si již Anti-Aliasing můžeme vychutnávat, aniž by klesla spojitost zobrazování (fps - počet obrázků za vteřinu) pod únosnou mez (cca 40-60 fps).
Princip AA není vždy jednoduchý (stále se hledají metody jak dosáhnout hladkého, a při tom v celé ploše ostrého zobrazení) - pro ilustraci si uveďme si jen jeden z jednoduchých principů, jak se zbavit ošklivého aliasingu: SuperSampling, zvětší problematickou část 2x až 4x a v této zvětšené podobě jednoduše interpoluje přechodové "chybějící" či nevhodně barevné pixely. Následuje Re-Sampling a zmenšení na původní velikost, která má 2x až 4x méně zubaté hrany než předchozí obraz.
Zde se můžete podívat na jednoduchý 4x sampling vzorku.
Každý chybějící pixel vznikne "zprůměrňováním" okolních 4 pixelů.
Pokud je Anti-Aliasing aplikován najednou na celý obraz, hovoříme o FSAA (Ful Screen Anti-Aliasing) nebo o HRAA (High-Resolution Anti-Aliasing). Karty s čipem Radeon využívají technologii SmoothVision. U silných grafických karet je možné nastavit 2x,4x i 6x AA, u nVidia jsou k dispozici ještě alternativní módy AA : První (starší) s podivným názvem QuinCunx, který sice neubírá tak drasticky výkon 3D karty, ovšem jeho kvalita je někde kolem a pod úrovní 2x A-A. Novější AccuView AA používají starší GeForce4 Ti a nabízí daleko lepší kvalitu zobrazení než Quincunx (na úrovni 4x AA). Moderní karty ATi a nVidia mají kvalitu AA velmi dobrou a to bez zásadního dopadu na výkon (když nebereme úvahu nejvyšší módy ATi 6x a nVidia 8x). Na nejnovější kartě nVidie GeForce 7800GTX je podporován tzv. Transparentní Anti-Aliasing, který dovoluje vyhladit hrany objektů s transparentními texturami jako listí či tráva. Tato metoda AA využívá jak Multi-Samplingu tak i Super-Samplingu, který je o poznání kvalitnější, ale má rovněž největší dopad na výkon. |
Rendering
Po průchodem všemi předcházejícími kroky získává obraz konečně svou finální podobu a může postoupit do vykreslovací (renderovací) fáze, ve které je celá operace podstoupena do videopaměti (framebuffer). Zde se ukládá nejen ucelený a hotový frame, ale současně se mažou i nepotřebné informace, poněvadž geometrická jednotka už pracuje s obrazem dalším. Dynamické zobrazení scény pracuje s dnešními grafickými kartami na velmi vysokých rychlostech. Během jedné vteřiny dokáže provést výpočet a vykreslení stovky i více hotových framů, což jsou desítky miliónů trojúhelníků a miliardy pixelů (hovoříme o tzv. Fill rate - schopnosti předávat hotové otexturované pixely do framebufferu).
- Pixel fill rate (MPixels/sekundu) - znamená kolik pixelů je schopna grafická karta předat za jednu sekundu do framebufferu
- Texel fill rate (MTexels/sekundu) - znamená kolik texturových elementů (Texelů) je schopna grafická karta natáhnout z paměti během jedné vteřiny. Tyto termíny bývají velmi často zaměňovány zejména v reklamních materiálech grafického čipu. Počet Texelů / s je vždy větší, často se jako míra porovnání i počet trojúhelníků za vteřinu (triangles / sec.), zpravidla v desítkách mil. / vteřinu.
Všechny popsané fáze postupu práce se scénou slučuje grafické jádro do jednotného modelu a operace popsané v tomto článku patří mezi opravdu ty základní. Celý proces je samozřejmě mnohem složitější a komplikovanější, ale doufám, že Vám toto malé pojednání objasnilo alespoň některé základní principy tak složitého procesu, jakým zobrazování grafické 3D scény je.
Čerpáno ze serverů www.reactorcritical.com, www.3dchipset.com, www.guru3d.com, www.bionicinfo.com...
Vynikajícím zdrojem informací jsou přednášky MFF UK v Praze (Hardware pro počítačovou grafiku PGR019)