jak-pracuje-graficka-karta-zaklady-3d
Hardware Článek Jak pracuje grafická karta - základy 3D

Jak pracuje grafická karta - základy 3D | Kapitola 3

Vopička Ondřej

Vopička Ondřej

30. 6. 2005 00:00 32

Seznam kapitol

1. Základní pojmy 2. Zpracování geometrie 3. Pixelové operace, rasterizace

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.

Reklama

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

Jak pracuje grafická karta - základy 3D
i Zdroj: PCTuning.cz

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).

Jak pracuje grafická karta - základy 3D
i Zdroj: PCTuning.cz
Jak pracuje grafická karta - základy 3D
i Zdroj: PCTuning.cz

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.


Vynikajícím zdrojem informací jsou přednášky MFF UK v Praze (Hardware pro počítačovou grafiku PGR019)

Předchozí
Další
Reklama
Reklama

Komentáře

Nejsi přihlášený(á)

Pro psaní a hodnocení komentářů se prosím přihlas ke svému účtu nebo si jej vytvoř.

Rychlé přihlášení přes:

Google Seznam
Reklama
Reklama