Hlavní navigace

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

22. 6. 2005
Doba čtení: 10 minut

Sdílet

V dnešním pokračování seriálu o grafických kartách a grafických akcelerátorech se budeme zabývat různými typy grafických subsystémů (obzvláště grafickými kartami a akcelerátory), které podporují vykreslování rastrové grafiky, tj. zejména takzvaných bitmap, pixmap, spritů a ve specifických případech i monochromatických a vícebarevných kurzorů myši. Také se povíme úvodní informace o grafických akcelerátorech speciálně určených pro vykreslování prostorové polygonální grafiky.

Obsah

1. Grafické subsystémy podporující práci s rastrovými objekty

    1.1 Grafické uživatelské rozhraní
    1.2 Vykreslování plnobarevných rastrových obrázků pro video a animace
2. Grafické čipy určené pro nezávislé vykreslování kurzoru myši
    2.1 Grafická karta S3 Trio64
3. Grafické čipy navržené pro rychlé vykreslování rastrových obrázků
    3.1 Pohnutky vedoucí k podpoře rastrové grafiky

    3.2 Konverze barev mezi různými barvovými systémy
    3.3 Změna rozměrů zobrazovaných pixmap či videa
4. Grafické akcelerátory podporující vykreslování plošných 3D primitiv
5. Obsah dalšího pokračování tohoto seriálu

1. Grafické subsystémy podporující práci s rastrovými objekty

Velkou skupinu v minulosti používaných grafických subsystémů tvoří moduly určené pro podporu popřípadě urychlení vykreslování jednoduchých rastrových objektů – bitmap (jednobarevných rastrových obrázků), pixmap (vícebarevných rastrových obrázků) a spritů (rastrových obrázků s nepravidelným okrajem). Jedná se o skupinu velmi rozmanitou, která obsahuje jak grafické čipy používané na osmibitových domácích počítačích, tak i poloprofesionální a profesionální grafické karty používané na osobních počítačích. Mezi základní operace, kterou tyto systémy již z principu musí podporovat, patří blokový přenos a následné vykreslení rastrových dat, tj. pixelů rozmístěných v pravidelné mřížce obdélníkové oblasti.

U některých aplikací, zejména multimediálních programů a počítačových her, je nutné vykreslovat libovolné tvary, nejenom osově orientované obdélníky. Tato problematika se řeší buď nastavením takzvané maskovací bitové mapy (hodnota jednotlivých bitů v této bitové mapě určuje, zda se má korespondující pixel vykreslit, či zda se ponechá stávající pozadí), nebo přiřazením průhlednosti každému vykreslovanému pixelu – barvy vykreslovaných pixelů jsou tedy vhodně kombinovány s barvou pozadí. První způsob vykreslování byl typický pro osmibitové počítače (například Atari 800/130, Commodore C64 atd.), druhý způsob doznal svého většího rozšíření až s nástupem počítačů PC.

Rastrové objekty se využívají zejména v následujících oblastech:

1.1 Grafické uživatelské rozhraní

Na osobních počítačích se se zvýšením výkonu mikroprocesorů a kapacit operačních pamětí postupně měnilo rozhraní, pomocí něhož aplikace komunikovaly s uživatelem. Od původního rozhraní s příkazovým řádkem (Command Line Interface – CLI) se přešlo přes celoobrazovkové textové rozhraní (Text-Mode User Interface – TUI) na grafické uživatelské rozhraní (Graphical User Interface – GUI), které má mimo dalších důležitých charakteristik i mnohem větší nároky na rychlost grafického subsystému. V prvé řadě jde o plynulé vykreslování kurzoru myši (z měření výkonu různých počítačů s operačním systémem Microsoft Windows 3.11 a IBM OS/2 vyplynulo, že zatížení mikroprocesoru při programovém zobrazování kurzoru myši může v některých případech překročit hranici 10 %), ve druhé řadě o vykreslování vlastního obsahu oken například při jejich přesunech nebo překreslování. V obou těchto případech je vhodné využít volnou grafickou paměť na grafické kartě, do které se uloží nejčastěji používané rastrové obrazce, například kurzory myši, ikony, obrazy tlačítek apod. Následně je možné pomocí operací blokového přesunu dat (Bit-Block Transfer – BitBlt – Blit) provést vykreslení těchto obrazců bez dalšího zbytečného zatížení mikroprocesoru a datové sběrnice.

1.2 Vykreslování plnobarevných rastrových obrázků pro video a animace

Pro vykreslování plnobarevných obrázků (truecolor) je zapotřebí, aby grafický systém podporoval operaci blokového přesunu rastrových dat s případnou konverzí mezi různými barvovými systémy. Důležitým požadavkem při přesunech je především zajištění co nejmenšího zatížení mikroprocesoru, protože objem přenášených dat může nabývat monstrózních rozměrů (snadným výpočtem lze například zjistit, že pro zobrazení videa s rozlišením „pouhých“ 740×574 pixelů je při snímkové frekvenci 25 fpp datový tok roven cca 30 Mbs-1). V ideálním případě řídí blokový přesun a barevné konverze grafický subsystém samostatně, mikroprocesor pouze celou operaci spustí. Při vykreslování videa je však mnohdy nutné provádět různé pokročilejší filtrace obrazu, například změnu poměru stran (např. ze 4:3 na 16:9) nebo odstranění prokladu řádků. I tyto operace by měl grafický subsystém podporovat bez přílišného zatížení mikroprocesoru, ideálně bez jeho zapojení do tohoto časově náročného procesu zpracování obrazu.

2. Grafické čipy určené pro nezávislé vykreslování kurzoru myši

S poměrně razantním nástupem grafických uživatelských rozhraní na osobní počítače (tj. zejména operačních systémů Microsoft Windows a IBM OS/2) se stále více ukazovala potřeba urychlení některých nejpoužívanějších grafických operací, zejména vykreslování grafiky, přesunu částí grafických obrazců a zobrazení navzájem se překrývajících oken. Úzkým hrdlem se stala zejména zastaralá sběrnice ISA, na kterou byly grafické karty připojeny. Tento problém byl vyřešen přechodem na sběrnici EISA, lokální sběrnici VESA Local Bus a později na plnohodnotnou universální sběrnici PCI. Bližší informace o těchto sběrnicích jsou uvedeny v deváté a desáté části tohoto seriálu.

Další graficky orientovanou operací, kterou bylo zapotřebí urychlit a zjednodušit, bylo vykreslování kurzoru myši. Na první pohled se může zdát, že se jedná o operaci podružnou, neboť kurzor myši obsazuje na ploše obrazovky poměrně malý prostor (typicky má velikost rastru 20×20 pixelů). Ve skutečnosti bylo při programovém vykreslování kurzoru myši zapotřebí při každé grafické operaci testovat, zda vykreslovaný obrazec nebo dialog nezasahuje do oblasti se zobrazeným kurzorem. Pokud kolize nastala, musel se obrazec nejprve neviditelně vykreslit do operační paměti počítače, poté bylo třeba provést kombinaci s kurzorem myši (pomocí bitově orientovaných operací) a následně výsledný modifikovaný obrázek okna či dialogu vykreslit. Pouze tak bylo možné zamezit poblikávání kurzoru, což by bylo z uživatelského hlediska nepřípustné. Také pohyb kurzoru musel být řešen přečtením obrazových dat z obrazové (video) paměti, jejich kombinací s rastrem kurzoru na nové pozici a opětovným zápisem do obrazové paměti. Objem dat, který se zbytečně přenese například při celodenní práci s GUI pak dosahuje řádu gigabajtů.

Zejména operace čtení z obrazové paměti byla dosti pomalá, proto se již počátkem devadesátých let stále častěji objevovaly grafické karty, které implementovaly pohyb kurzoru myši s HW podporou. Princip funkce těchto karet při práci s kurzorem byl velmi podobný jako u dříve popsaných čipů ANTIC a GTIA v osmibitových počítačích firmy Atari, tj. rastrový obraz kurzoru se kombinoval s rastrovým obrazem pozadí až během vykreslování, vlastní pozadí tedy nebylo kurzorem měněno.

Urychlení zobrazování se oproti běžným grafickým kartám bez podpory vykreslování kurzoru myši pohybovalo v řádu procent až desítek procent, zejména při práci s plnobarevným kurzorem. Mezi karty, které podporovaly nezávislé vykreslování kurzoru myši, patří především karty Cirrus Logic s grafickými čipy řady CL-GD 542×, CL-GD 543× a CL-GD 64×x. Z jiných firem vyrábějících grafické karty jmenujme například velmi úspěšnou firmu S3 (grafické čipy řady Vision 864, 964, 866 a 868, dále Trio 32, Trio 64 – poslední jmenované čipy se staly nepsaným standardem v mnoha kancelářských počítačích) a Matrox (zejména velmi kvalitní karty známé vývojové řady Matrox Millenium).

2.1 Grafická karta S3 Trio64

Na následujícím obrázku je zobrazen způsob kombinace tří datových toků (data streams) v grafickém čipu S3 Trio64. První datový tok představuje běžná rastrová data, druhý tok může být použit například pro zobrazení videa, ve třetím toku se přenáší rastrová data kurzoru myši.

GFX 17

Kombinace tří datových toků v grafickém čipu S3 Trio64

I dnes používané 3D grafické akcelerátory podporují nezávislé vykreslování kurzoru myši, v těchto kartách se však pro vykreslení používá většinou texturovací jednotka, takže princip práce je poněkud jiný než u výše jmenovaných grafických karet.

3. Grafické čipy navržené pro rychlé vykreslování rastrových obrázků

Při práci s videem a animacemi je často zapotřebí zobrazovat sekvence snímků (tj. rastrových obrázků) s poměrně vysokým snímkovým kmitočtem, který je udáván počtem zobrazených snímků za sekundu (tato veličina se v literatuře označuje zkratkou fps vzniklou podle anglického výrazu Frames Per Second). Pro video kompatibilní s televizním vysíláním či filmem je zapotřebí zobrazovat snímky s frekvencemi typicky 24, 25 a 30 fps. Vzhledem k poměrně velkému počtu pixelů, ze kterých je složen video snímek (například při rozlišení 740×574 pixelů přesahuje celkový počet pixelů hodnotu 420 tisíc), a velkému množství barev je zapotřebí do grafické karty přenášet značné množství dat. Požadovaná rychlost přenosu těchto dat se pohybuje v řádu desítek až stovek megabitů za sekundu.

3.1 Pohnutky vedoucí k podpoře rastrové grafiky

Výpočetní výkon dnešních mikroprocesorů a rychlost operačních pamětí i sběrnic sice plně dostačují pro přenos videa z operační paměti do grafické (video) paměti, ale pokud by měl veškerý přenos řídit samotný mikroprocesor, docházelo by k velkému zatížení celého výpočetního systému, zejména z důvodu častého přepisu vyrovnávacích pamětí mikroprocesoru. Měřením v minulosti jsme například zjistili, že přenos a zobrazení videa o výše zmíněném rozlišení 740×574 pixelů se snímkovou frekvencí 25 fps zatěžuje mikroprocesor Intel P4 1,2 GHz z cca 60 %. Pokud však grafická karta převezme řízení přenosu videa, klesne zatížení mikroprocesoru na hodnotu cca 25 %. Z tohoto důvodu je samozřejmě mnohem výhodnější, když přenos video dat řídí samotná grafická karta. Vzhledem k tomu, že jsou data přenášena z operační paměti, musí se provádět arbitráž mezi přístupem mikroprocesoru a grafické karty do této paměti. Tuto arbitráž může provést buď přímo grafická karta (zejména pokud pracuje v režimu bus-master), mikroprocesor, nebo řadič sběrnice.

3.2 Konverze barev mezi různými barvovými systémy

Dalším úkolem, který je nutno při zobrazování videa řešit, je konverze barev zobrazovaných pixelů mezi různými barvovými systémy. Zatímco jsou video data uložena například v barvovém systému YCbCr (monochromatická složka a dvě doplňkové chromatické složky), pracují grafické karty většinou se systémem RGB – Red, Green, Blue (na druhou stranu je pravda, že některé grafické karty mohou být nakonfigurovány tak, že jejich framebuffer používá jiný barvový prostor). Také se může lišit barevná hloubka videa a nastaveného grafického režimu. Při zobrazení videa je tedy nutné provádět konverze jednotlivých pixelů, což je vzhledem k vysokému datovému toku opět operace prováděná grafickou kartou.

3.3 Změna rozměrů zobrazovaných pixmap či videa

V neposlední řadě je po grafických kartách také vyžadována schopnost zvětšovat, zmenšovat a zrcadlit zobrazované video, často dokonce neproporcionálně (například kvůli konverzi mezi televizním formátem 4:3 a širokoúhlým filmovým formátem 16:9). Při těchto operacích je nutné používat různé metody interpolace a filtrace obrazu, aby se zamezilo vzniku nežádoucích vizuálních artefaktů vlivem podvzorkování signálu (časový a především prostorový alias). Tyto operace je většinou nutné provádět přímo na grafické kartě, protože při výpočtu mikroprocesorem by byly velmi pomalé, opět z důvodu dvojího přenosu dat přes sběrnice a vyrovnávací paměti. Zejména se to týká operací zrcadlení, kdy dochází při čtení či zápisu k neustálému vyprazdňování vyrovnávací paměti (buď čtení či zápis se provádí v opačném pořadí, než v jakém jsou přirozeně uspořádány paměťové buňky).

Mezi prvními široce používanými grafickými kartami, které obsahovaly podporu pro rychlé vykreslování rastrových obrázků (videa), patří karty Cirrus Logic řady CL-GD 64×x, S3 Trio32 a především karty od kanadské firmy ATI, například ATI Rage 128, která současně patří do třídy 3D grafických akcelerátorů popsaných v následující kapitole.

4. Grafické akcelerátory podporující vykreslování plošných 3D primitiv

V současnosti patří mezi nejčastěji používané grafické akcelerátory takové systémy, které umožňují rychlé vykreslení prostorových těles popsaných pomocí hraniční reprezentace. Zjednodušeně můžeme říct, že základní operací, kterou musí tyto grafické akcelerátory provádět, je zobrazení vyplněných trojúhelníků s korektním řešením jejich vzájemného překryvu podle vzdálenosti od pozorovatele (kamery).

Tato základní operace však musí být pro reálné použití značně rozšířena, protože trojúhelník může být osvětlen jedním či několika světelnými zdroji nebo může být pokryt texturou, popř. obojí (k tomu ještě připočítejme možnost vykreslení poloprůhledných trojúhelníků). Dále může být povrch prostorových těles zadán polygony s větším počtem vrcholů, takže je – v případech, kdy se jedná o polygony nekonvexní – zapotřebí provádět tesselaci obecných polygonů na jednodušší trojúhelníky. V neposlední řadě je žádoucí provádět pokročilejší operace s vykreslovanými tělesy (resp. s jejich povrchem), například postupné skrývání objektů v mlze (fog), bilineární či trilineární filtraci textur nebo antialiasing při vykreslování (supersampling, adaptive antialiasing).

Grafické akcelerátory z této kategorie se neustále zrychlují a zdokonalují, čímž je umožněna aplikace stále většího množství grafických algoritmů přímo na čipech grafického akcelerátoru. To je důležité zejména v situacích, kdy se kromě vlastního zobrazování provádějí i další výpočty, například fyzikální simulace či výpočet trajektorie a případných kolizí pohybujících se těles. V tomto případě je vhodné ponechat co nejvíce výpočetního výkonu mikroprocesoru pro výpočet simulací a veškeré grafické algoritmy či jejich co největší část provádět na specializovaném zařízení – grafickém mikroprocesoru GPU (Graphics Processor Unit).

Za zmínku stojí také skutečnost, že téměř všechny postupy, které jsou dnes implementovány na popisovaných grafických akcelerátorech, je možné vyjádřit či popsat pomocí funkcí dvou nejpoužívanějších rozhraní pro 3D grafiku: OpenGL a DirectX. To je výhodné především pro programátory, kteří mohou jednotně vytvářet aplikace funkční na téměř všech grafických akcelerátorech této kategorie. Pokud není nějaký grafický efekt či trik přímo implementován na akcelerátoru, je zvolen jeho (obecně pomalejší) programový výpočet nebo se efekt vůbec neaplikuje. Pěkným příkladem je například takzvaný bump mapping, který je možné vynechat za cenu vizuálního „vyrovnání” původně nerovných povrchů.

Cloud 24 - tip 1

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

V dalším pokračování tohoto seriálu se budeme věnovat zejména grafickým akcelerátorům určeným pro vykreslování trojrozměrných těles reprezentovaných plošnými polygony, především principu jejich práce. Také si popíšeme možný budoucí vývoj těchto typů grafických akcelerátorů.

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.