Hlavní navigace

Grafické karty a grafické akcelerátory (19)

13. 7. 2005
Doba čtení: 11 minut

Sdílet

V dnešní části seriálu pojednávajícího o grafických kartách a grafických akcelerátorech si popíšeme funkci specializovaných bloků moderních grafických čipů, které provádějí výpočet lineárních transformací a osvětlení. Dále se budeme zabývat popisem grafických akcelerátorů, které jsou určeny pro zobrazování objemových dat, tj. těles složených z takzvaných objemových elementů - voxelů.

Obsah

1. Funkční blok pro provádění transformací – Transform
2. Funkční blok pro výpočet osvětlení – Lighting
3. Parametry vybraných grafických akcelerátorů
4. Grafické akcelerátory specializované na práci s objemovými daty
5. Grafický akcelerátor VolumePro 500
6. Obsah dalšího pokračování tohoto seriálu

1. Funkční blok pro provádění transformací – Transform

V bloku Transform jsou prováděny transformace bodů a vektorů. Nejdůležitějším úkolem tohoto bloku je transformace vrcholů plošných polygonů spolu s jejich normálovými vektory. Dalším úkolem je u některých implementací také odstranění (culling a clipping) neviditelných nebo odvrácených polygonů před jejich vykreslením. Geometrické informace o těchto polygonech jsou buď průběžně zasílány do grafického akcelerátoru, nebo jsou uloženy v display listech přímo v paměti akcelerátoru.

Každý vrchol polygonu (velká část grafických akcelerátorů akceptuje pouze konvexní polygony, některé akcelerátory dokonce zpracovávají pouze trojúhelníky, které vždy představují konvexní a současně plošný polygon – o této problematice jsem se opět zmiňoval v seriálu o grafické knihovně OpenGL) musí být spolu se svým normálovým vektorem podroben několika transformacím. Nejdříve je zapotřebí transformovat polygony ze systému světových souřadnic (world coordinates) do souřadnic odpovídajících pozici a orientaci pozorovatele – tato transformace se proto nazývá pohledová transformace (view transformation). V této chvíli je podle orientace polygonu vůči pozorovateli možné rozhodnout, zda je polygon potenciálně viditelný, či nikoliv. Pokud je polygon od pozorovatele odvrácen, je možné jej odstranit. Tento proces se nazýváculling.

Dále se provádí transformace ze souřadnic pozorovatele do souřadnic, které korespondují s viditelnou plochou na obrazovce (screen coordinates). Pro tuto plochu platí, že osy X a Y odpovídají horizontálnímu a vertikálnímu směru na ploše obrazovky, zatímco Zová osa je na tuto plochu kolmá. Této transformaci se také říká projekce nebo promítání (projection). Po provedení projekce se mohou odstranit ty části scény, které nejsou viditelné. Odstranění se sice může provádět už po provedení pohledové transformace, ale z hlediska implementace na grafickém akcelerátoru je vhodnější provádění až po provedení projekce a převodu do normovaných souřadnic. Samozřejmě je také nutné transformovat těleso záběru, které tak změní tvar z komolého jehlanu na krychli (u mnoha grafických akcelerátorů dokonce na jednotkovou krychli). Toto odstraňování se nazývá ořezávání (clipping) a může podstatně urychlit vykreslování, neboť do texturovací a rasterizační jednotky jsou posílány pouze polygony, které jsou potenciálně viditelné, tj. jsou uvnitř tělesa záběru (viewing volume).

Všechny popsané transformace lze převést na poměrně jednoduše realizovatelné operace násobení dvojice matic. Podmínkou je, aby všechny souřadnice vrcholů byly vyjádřeny čtyřsložkovým vektorem v=(x, y, z, w), kde [x, y, z] jsou souřadnice vrcholu v prostoru a w je homogenní souřadnice. Každou základní transformaci (tj. posun, otáčení, změnu měřítka a perspektivní projekci) lze vyjádřit maticí velikosti 4×4 prvky. Provedení transformace potom odpovídá vynásobení čtyřsložkového vektoru v s touto maticí. Jelikož transformujeme body, je zapotřebí po každé operaci (v našem případě po projekci) zajistit, aby čtvrtá složka vektoru měla hodnotu w=1, proto se musí na závěr všech transformací provést operace (x', y', z', 1)=(x/w, y/w, z/w, w/w).

Úkolem bloku Transform je tedy vynásobení souřadnic každého vrcholu pohledovou transformační maticí, odstranění neviditelných částí, následné vynásobení projekční maticí, homogenizace souřadnic a odřezání těch plošek, které se nacházejí mimo oblast záběru. Všechny tyto operace jsou poměrně jednoduše realizovatelné, zejména se zde naskýtá možnost využít velké množství řezů (slices) výpočetní jednotky a aplikovat proudové zpracování dat – proudové zpracování a grafická pipeline jsou ostatně základem vysoké zobrazovací rychlosti dnešních grafických akcelerátorů.

Samozřejmě je možné transformace provádět přímo pomocí hlavního procesoru počítače s případným využitím specializovaných instrukcí (pro tento účel jsou moderní mikroprocesory vybaveny instrukcemi SSE navrženými firmou Intel nebo 3Dnow od firmy AMD), ale vzhledem k velkému množství vrcholů u běžně vykreslovaných trojrozměrných scén by se jednalo o značné zatížení, a tím i o potenciální snížení rychlosti vykreslování. Proto se stále více výpočetních kroků, zejména těch, kde se neřeší složité rozhodování a neprovádějí cykly, realizuje přímo na grafickém akcelerátoru.

2. Funkční blok pro výpočet osvětlení – Lighting

Druhým blokem použitým u moderních grafických akcelerátorů je blok nazývaný Lighting, tj. osvětlování. V tomto bloku se provádí výpočet osvětlení jednotlivých polygonů. Výpočty se podle požadované kvality zobrazení a schopnosti grafického akcelerátoru provádějí buď pro každý vrchol (Per-Vertex Lighting) polygonu, nebo pro každý vykreslovaný pixel (Per-Pixel Lighting). Druhá možnost je sice náročnější na výpočetní výkon grafického akcelerátoru, ale poskytuje vizuálně přesnější výsledky. Výpočet osvětlení je založen na empirickém Phongově osvětlovacím modelu, který přes svou značnou jednoduchost a tím i rychlost výpočtů poskytuje poměrně kvalitní výsledky. Teoreticky je možné použít i složitější a přesnější osvětlovací modely, ty se však pro grafickou akceleraci příliš nehodí, zejména pro svoji vysokou výpočetní náročnost.

U Phongova osvětlovacího modelu je zapotřebí určit geometrické a optické vlastnosti světelných zdrojů a materiálů, ze kterých je povrch tělesa složen. Mezi základní vlastnosti světelných zdrojů patří především jejich pozice v prostoru, orientace (pouze u směrového a reflektorového světla) a koeficienty ambientní, difúzní a odrazové složky světla. U materiálů je zapotřebí určit taktéž koeficienty ambientní, difúzní a odrazové složky.

Pro každý polygon, pro který má být vypočteno osvětlení, je také nutné zadat normálu. Ta je buď na celé ploše polygonu konstantní (konstantní stínování, flat shading), nebo je zadána zvlášť pro každý vrchol polygonu (Gouraudovo stínování, Gouraud shading). V prvním případě je osvětlení vypočteno pro každý polygon pouze jednou a polygon bude celý pokryt neměnnou, konstantní barvou. Samozřejmě je možné kombinovat osvětlení s texturováním. V případě, že je texturování povoleno, by byl objekt pokrytý texturou, která by byla modulovaná konstantní barvou. Tento způsob bývá označován také jako per face lighting. Ve druhém případě se osvětlení vypočte pro každý vrchol zvlášť a polygon je pokryt barevným přechodem vyčísleným pomocí lineární resp. bilineární interpolace barvy mezi vrcholy. Tento způsob se označuje jako per vertex lighting a přes svou jednoduchost dává poměrně dobré vizuální výsledky.

Poznamenejme, že některé vyspělé grafické akcelerátory mají zabudovanou podporu i pro Phongovo stínování (Phong shading), kde se pomocí interpolace vyčísluje normála každého vykreslovaného fragmentu (tj. pixelu s hloubkou) a osvětlení je tedy spočteno samostatně pro každý fragment (per pixel lighting, resp. přesněji per fragment lighting). Phongovo stínování sice umožňuje získat kvalitativně nejlepší vizuální výsledky, ovšem na úkor zvýšené složitosti. Proto se u běžných grafických akcelerátorů a na nich postavených aplikací příliš neujalo.

Samotná implementace bloku pro výpočet osvětlení v sobě zahrnuje především výpočty skalárních součinů vektorů (vektor směřující ke světelnému zdroji s normálovým vektorem a vektor ideálně odraženého světelného paprsku s vektorem orientovaným směrem k pozorovateli), normalizaci vektorů a výpočet exponentu (pouze v případě výpočtu odlesků). Implementace je tedy vzhledem k použitým operacím poněkud složitější než v případě bloku pro provádění transformací, proto je u některých grafických akcelerátorů tento blok zjednodušen; například je odstraněna normalizace vektorů, kterou musí předem provést aplikace nebo grafická knihovna s využitím výpočetního výkonu mikroprocesoru počítače.

3. Parametry vybraných grafických akcelerátorů

předchozí části tohoto seriálu jsme si popsali postupný vývoj grafických akcelerátorů určených pro vykreslování prostorových těles složených z polygonů. V následujících tabulkách jsou uvedeny základní parametry vybraných moderních grafických akcelerátorů (je však samozřejmé, že v době vydání tohoto článku budou k dispozici rychlejší grafické akcelerátory). U popisovaných akcelerátorů je jasně patrná snaha o maximální urychlení přesunů dat mezi pamětí a grafickým procesorem a také o přímou integraci velkého množství sofistikovaných metod pro vytváření různých grafických efektů.

Velmi zajímavá a prospěšná je také implementace pixel a vertex shaderů. Zejména modul pro aplikaci pixel shaderů je u některých grafických akcelerátorů řešen tak, že pomocí jedné instrukce je možné změnit hodnoty více pixelů v jednom kroku/cyklu. Podle své podobnosti s některými instrukcemi používanými u běžných (univerzálních) mikroprocesorů se tyto operace nazývají SIMD – Single Instruction Multiple Data. Problematikou pixel a vertex shaderů se budu podrobně zabývat v dalších částech tohoto seriálu, stejně jako programovacím jazykem Cg, ve kterém se grafické algoritmy programují.

Parametry grafického akcelerátoru ATI Radeon 9800XT
Označení GPU Radeon 9800XT
Frekvence GPU 412 MHz
Typ paměti DDR
Frekvence paměti 730 MHz
Interní sběrnice 128 bitů
Pixel shader ano
Vertex shader ano
Podpora shaderů jazyk HLSL
Programová podpora OpenGL
  DirectX 9
Parametry grafického akcelerátoru nVidia GeForce FX 5700 Ultra
Označení GPU FX 5700 NV36
Frekvence GPU 475 MHz
Typ paměti DDR II
Frekvence paměti 450/900 MHz
Interní sběrnice 128 bitů
Pixel shader ano SIMD
Vertex shader ano
Podpora shaderů Cg
Programová podpora OpenGL
  DirectX 8
Parametry grafického akcelerátoru nVidia GeForce FX 5950 Ultra
Označení GPU FX 5950 NV38
Frekvence GPU 475 MHz
Typ paměti DDR II
Frekvence paměti 475/950 MHz
Interní sběrnice 128 bitů
Pixel shader ano SIMD
Vertex shader ano
Podpora shaderů Cg
Programová podpora OpenGL
  DirectX 8

4. Grafické akcelerátory specializované na práci s objemovými daty

Při práci s rozsáhlými objemovými daty (uloženými pomocí objemových elementů – voxelů) můžeme pro vykreslování taktéž využít grafických akcelerátorů. Typů těchto akcelerátorů je však podstatně méně, než tomu bylo u akcelerátorů určených pro zobrazení trojrozměrných těles vytvořených z polygonů, tj. v hraniční reprezentaci. Hlavní důvody současného stavu jsou dva:

  1. Prvním důvodem je skutečnost, že objemová data jsou doposud využívána v poměrně specifických případech, jako je medicína nebo materiálové inženýrství. Z hlediska výrobců grafických akcelerátorů se tedy zdaleka nejedná o masový trh, čemuž odpovídá i počet vyrobených kusů, a tím pádem i výsledná cena těchto grafických akcelerátorů.
  2. Druhým důvodem jsou mnohem větší nároky na kapacitu a rychlost pamětí, které jsou v grafickém akcelerátoru pro zobrazování objemových dat použity. Zatímco nároky na kapacitu pamětí u akcelerátorů polygonové grafiky jsou mířeny do oblasti dostatečně velkého framebufferu a texturovací paměti (čtení a zápis z texturovací paměti sice není přísně lineární, ale je alespoň lokální, protože se vždy vykresluje pouze jedna či dvě textury), u grafického akcelerátoru pro objemovou grafiku je zapotřebí počítat s uložením celého objemu dat, přičemž v reálných aplikacích jsou běžná rozlišení 2563 voxelů a výše. Pokud je pro zobrazení objemových dat zvolen algoritmus integrace podél paprsku, je přístup do paměti ve své podstatě náhodný, takže se úměrně zvyšují i nároky na rychlost vybavení dat v těchto pamětech.

V budoucnu lze očekávat významné zvýšení požadavků na technické parametry nových grafických akcelerátorů pro zobrazení objemových dat, protože počet aplikací pro práci s těmito daty se neustále zvyšuje. Také se stále častěji začínají používat zařízení (zejména typu CT a MR), pomocí kterých lze objemová data získat. V tomto článku popíšu pouze jeden typ grafického akcelerátoru určeného pro práci s objemovými daty, kterým je dnes už sice starší, ale v některých oborech často používaná grafická karta VolumePro 500.

5. Grafický akcelerátor VolumePro 500

Grafický akcelerátor VolumePro 500 je navržen jako přídavná akcelerační karta určená pro připojení do sběrnice PCI. Tuto kartu lze použít v osobních počítačích typu IBM PC, pracovních stanicích firmy Sun Microsystems a samozřejmě v grafických stanicích Silicon Graphics O2. K zobrazení výstupů z běžných programů je zapotřebí připojit i „normální“ grafickou kartu. Na kartě VolumePro je pro zobrazování objemových dat implementována metoda objektově orientovaného vrhání paprsku, ale pouze v rovnoběžné projekci (to může při určitých pohledech způsobovat vznik nežádoucích vizuálních chyb). Výpočetní výkon tohoto grafického akcelerátoru umožňuje dosáhnout zobrazování objemových dat o velikosti až 2563 dvanáctibitových voxelů v reálném čase, tj. s obnovovací frekvencí 30 snímků za sekundu. Tento výkon zhruba odpovídá výpočtu 500 milionů vzorků osvětlených Phongovým osvětlovacím modelem za sekundu. Akcelerační karta obsahuje 160 MB rychlé paměti SDRAM. Paměť je rozdělena na tři části různých velikostí:

GFX 19a

Karta VolumePro 500

  1. První část paměti o velikosti 128 MB slouží pro uložení objemových dat (tj. trojrozměrné ortogonální voxelové mřížky) o rozměrech maximálně 512×512×256. Při změně bitové hloubky voxelů se rozměr mřížky samozřejmě zmenšuje. Při vykreslování se však vždy pracuje s mřížkou 256×256×256 voxelů. Větší mřížky je možné zpracovat tak, že se rozdělí na takzvané řezy (jež se částečně překrývají), které se do karty nahrávají (a zobrazují) postupně, což však vede k velkému vytížení PCI sběrnice. Novější verze této karty (VolumePro 500–2× a VolumePro 1000 má k dispozici větší množství paměti pro objemovou mřížku – 256 MB a výše.)
  2. Druhá část paměti, která má velikost 16 MB, slouží k uložení dočasných mezivýsledků výpočtů.
  3. Do třetí části o velikosti taktéž 16 MB je ukládán výstupní obrázek – jedná se tedy o značně zjednodušený framebuffer. V této oblasti se může alokovat přední i zadní buffer pro implementaci double bufferingu.

Všechny objemové vzorky podél vrhaných paprsků se vyčíslují pomocí trilineární interpolace z nejbližších sousedních voxelů. Odhad gradientu je proveden symetrickou diferencí v každém bodě podél paprsku – zde opět dochází ke vzniku chyb vlivem špatně vypočtené normály. Karta také umožňuje provést interaktivní změnu parametrů zobrazení. Změnit lze samozřejmě směr pohledu, nastavit ořezávání až šesti rovinami rovnoběžnými se stěnami objemu, nastavit ořezávání jednou obecně orientovanou rovinou a – což je v reálných aplikacích důležité – provést selektivní výběr obnovování objemu. Kromě toho je možné zobrazit trojrozměrný kurzor, který se skládá buď ze tří úseček, nebo ze tří na sebe kolmých rovin.

Z výše uvedených parametrů je patrné, že tento grafický akcelerátor je určen především pro zobrazování dat v medicínských a technických aplikacích. Pro fotorealistické zobrazování (resp. pro jeho obdobu, pokud bereme v úvahu objemový charakter vstupních dat) neobsahuje některé základní vlastnosti, zejména podporu pro perspektivní promítání. Odhad gradientu je prováděn v poměrně malém okolí počítaného voxelu, žádné adaptivní či globální metody hledání povrchu zde nejsou z rychlostních důvodů použity. Problematická je také interaktivní změna zobrazovaného objemu, neboť zde narážíme na datovou propustnost použité sběrnice PCI.

GFX 19b

Objemové modely

CS24_early

6. Obsah dalšího pokračování tohoto seriálu

Další část tohoto seriálu bude věnována dvěma zajímavým problematikám – zobrazování videa spolu s ostatní grafikou a programovatelným grafickým akcelerátorům.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.