Full-Scene AntiAliasing



Upozornění:

Níže uvedený článek jsem připravil ještě před nástupem nové generace grafických čipů (NV40, R420). To znamená, že neobsahuje informace o novinkách, jež tyto čipy přinesly. K jejich příchodu se váže i částečná změna názvů a značení jednotlivých algoritmů. V době, kdy jsem článek psal, jsem používal jistý systém rozdělení a názvů, ale vlivem příchodu novinek došlo ke značným změnám nomenklatury, takže označení určitého režimu FSAA již může znamenat trochu něco jiného, než uvádním ve článku. Protože nyní připravuji rozsáhlé pojednání o FSAA pro PC-Tuning, bylo by značně neefektivní upravovat i tento článek. Proto jsem zvolil co nejschůdnější řešení a přistoupil jsem pouze k několika nejnutnějším korekcím v úvodní části článku (tak, aby zde nebyla vyloženě chybná tvrzení). Zároveň však chci upozornit, že mnohé pasáže mohou být nepřesné až nekorektní - užívejte tedy všech informací z tohoto článku s úvahou a na vlastní riziko. Rozsáhlejší, podrobnější, korektnější a aktuálnější pojednání najdete za čas na www.pctuning.cz.





    Full-Scene AntiAliasing je označení pro soubor metod (či algoritmů), jejichž cílem je potlačit prvky Aliasu na celé scéně. Je logické (a správné) se domnívat, že pokud je zdůrazňováno "Full-Scene", musí existovat i jiné typy AntiAliasingu. Proč se ale AntiAliasing začal vůbec používat? Co je Aliasing?

    Počítačová grafika funguje na základě rastrů, tedy obrazů, které se skládají z určitých nedělitelných subjektů - pixelů. Tím jsou poměrně omezeny zobrazovací schopnosti. Nelze zobrazit objekt menší než pixel a nelze zobrazit plynulý barevný přechod. Tomuto je možné předcházet zvyšováním množství pixelů na jednotku plochy (rozlišení), ale to je velice výpočetně náročné a obrazové defekty budou de-facto jen posunuty do vyšších frekvencí. Také dnešní monitory také takové rozlišení nezvládají. Mluvíme tedy o tzv. diskrétním prostředí (funguje ve skocích, je stanoveno nedělitelné minimum - zde pixel). Zobrazování v celých pixelech způsobuje určité nepřesnosti - Alias (či Aliasing)

    Samozřejmě existují i jiné typy Aliasu, ale o těch jen stručně. Jsou způsobeny např. snímkovou rychlostí, se kterou pracuje počítač a projevují se třeba trhaným pohybem objektů, který by měl být plynulý, známý je také defekt rotujícího kola (které vlivem nedostatečné snímkové rychlosti vypadá, jakoby se točilo např. na opačnou stranu). K redukci těchto defektů slouží tzv. Temporal AntiAliasing (časový AA) známý spíše pod názvem Motion Blur.

    Vraťme se ale k projevům Aliasu ve statickém obraze. Pokud se zaměříme jen na svět 3D, tak nejvýrazněji se Alias projevuje jako tzv. Jaggies (zubaté hrany), Subpixel Flickering (mizení či poblikávání objektů, které jsou alespoň jedním z rozměrů menší než pixel), Pixel Poppingem (části polygonů, které se ztenčují a stávají se užšími než jeden pixel se při pohybu objevují a mizí, takže vypadají, jako by z polygonu "vyskakovaly". Aliasing se také projevuje zkreslením textur (rozlišení textury je obvykle vyšší, než rozlišení, na které je textura ve výsledku promítnuta, čímž je snížena její ostrost, detailnost atp.). K potlačení těchto defektů (či obrazových artefaktů) slouží právě Full-Scene AntiAliasing.


Edge AntiAliasing

    Pokud se vrátíme na začátek éry 3D akcelerace, tak prvním pokusem o potlačení Aliasingu byl tzv. Edge AntiAliasing. Název by mohl být zavádějící. AntiAliasing není prováděn na hranách objektů, ale na hranách polygonů. Tedy tam, kde se dva polygony stýkají. Okraje (tzv. "siluety", neboli "silhouettes") celých objektů (např. postav) zůstanou nezměněny (tzn. zubaté). Algoritmus, kterým je Edge AntiAliasing prováděn není nijak stanoven, ale používána byla jednoduchá barevná interpolace. Nabízím syntetickou ukázku:

bez EAA s EAA
bez EAA s EAA

    Rozdíl je jen v místě kontaktu červeného a modrého polygonu. Scéna je normálně vyrenderována a poté je prohnána detekcí hran (kterou může zastávat i CPU). Detekované hrany jsou pak víceméně rozmazány (nejde tedy o nějaký XY-sampling, který by pracoval s několika vzorky na pixel, jde jen o jednoduchou interpolaci). Tento režim je časově náročný a neposkytuje příliš dobré výsledky.


Full-Scene AntiAliasing

    První, kdo přišel s nápadem používat FSAA na domácích systémech, bylo 3Dfx. Navíc nešlo o jen tak nějaký algoritmus, takže 3Dfx mělo nejen plně hardwarový FSAA jako první, ale také jeho kvalita je pověstná dodnes a stále je tento algoritmus používán jako referenční FSAA. Než ale společnost 3Dfx grafické karty založené na procesorech VSA vydalo, přišla společnost nVidia s nápadem implementovat jiný algoritmus FSAA do svých ovladačů (tedy softwarově), takže jako první byl k dispozici FSAA na hardwaru nVidia (ale jen softwarově). Pak přišla ATi, která taktéž přinesla vlastní algoritmy. Vezměme to popořadě.


SuperSampling vs. MultiSampling

FSAA rozdělujeme na tzv. SuperSampling a MultiSampling. Existuje mnoho kritérií, podle kterých lze určitý algoritmus považovat za jeden nebo druhý typ. Mnoho odborníků si s některými algoritmy neví příliš rady, a tak se objevují stále další způsoby rozdělování. Ty nejrozšířenější jsou:


I. SS zpracovává celou scénu, MS jen části, konkrétně okraje podle jednoduchého testu polohy pixelu (subpixelů) na polygonu.
II. SS určí pro každý subsample (=subpixel) jednoho pixelu barvu a Z-value (info o pozici), kdežto MS počítá se stejnou barevnou hodnotou všech subpixelů téhož pixelu.
III. Algoritmus, který vytváří výslednou barvu pixelu zprůměrováním barev několika subpixelů je SuperSampling.
IV. SS renderuje scénu (nebo část) ve vyšším rozlišení (X krát) a poté je obraz zmenšen (X krát). MultiSampling scénu (nebo její část) vytváří rovnou ve výstupním rozlišení, ale několikrát (X krát); pokaždé s nepatrným posunem (který je určený požadovanou pozicí subpixelů).


    Toto jsou 4 různé názory. Jsou vzájemně provázané, ale také se vyvracejí. Např. "III" můžeme uvažovat pouze v případě, že vycházíme z předpokladu "II". Velice rozšířený je první názor. To ale není dobře, protože fakt, že AA je použit jen na konkrétní úseky obrazu ještě nic neříká o použitém postupu. Asi nejrozšířenější je definice "II". Já osobně bych s ní souhlasil, pokud je zároveň přihlédnuto k bodu "IV". Důvod je prostý. S touto jednoduchou definicí je možné jednoduše rozdělit všechny používané metody. Navíc poměrně logicky udává, že MultiSampling přebírá vzorky z více ("multi") vyrenderovaných snímků.



    Dnes jsou převážně používány metody, které pracují jen na hranách polygonů a okrajích objektů (tedy na místech, kde jsou Jaggies nejpatrnější; tyto principy využívá Radeon 9500 a vyšší a GeForce 3 a vyšší). Protože není vyhlazena celá scéna, nejde již v podstatě ani o Full-Scene AntiAliasing. Přesto tak bývá nadále označován (můžeme ho označovat jako Optimized Full-Scene AntiAliasing). Výhoda tohoto režimu je zjevná: rychlost. Protože jsou zpracovány jen okraje a hrany, textury zůstávají nedotčené. Zde byl postupem času FSAA nahrazen Anizotropním Filtrováním, které kvalitu textur dokáže pozdvihnout mnohem výrazněji (podle tvrzení výrobců hardwaru; skutečnost je trochu jinde).


Uspořádání vzorků (=SubPixels, Samples)

    Kvalita výsledného obrazu je velice závislá na rozložení vzorků (samplů). Existují čtyři běžné způsoby:

 Ordered Sampling   Ordered Grid AA   nVidia, Matrox (Parhelia), PowerVR (Kyro series)
Rotated Grid AA   3Dfx
 Non-Ordered Sampling   Semi-Jittered AA   ATi (Radeon >8500)
Stochastic AA   Následník 3Dfx Rampage


Ordered Grid

    Uspořádané rozložení je nejjednodušším modelem polohy subpixelů. V nejjednodušším případě 2x2 (tedy 4x) vychází z následujícího modelu: Každý pixel se rozdělí na 4 části (subpixely) a z centra každého je pak odebrán tzv. sample (barevný vzorek). Barva 4 vzorků je pak interpolována (prolnuta, zprůměrována) a je použita pro celý pixel. Nejjednodušší postupem, jak tento algoritmus používat je tzv. DownSampling, tedy vytvoření obrazu ve vyšším rozlišení a jeho následné zmenšení.



Subpixely jsou pravidelně rozloženy. Z každého pixelu jsou odebrány 4 vzorky, jejichž průměrná hodnota je použita pro celý pixel.


Rotated Grid

    Rotated-Grid FSAA vznikne z mřížky OG pootočením. Velice záleží na úhlu pootočení. Nejlepší je tak 20-30° (ideálně kolem 25°). Často jsou k vidění i obrázky, kde je mřížka pootočena o celých 45° (tedy na koso), ale to už má algoritmus účinnost nižší (stále však vyšší, než RG). Ideální je, aby vzdálenost mezi rovnoběžkami (rovnoběžnými s vertikálou či horizontálou) procházejícími jednotlivými subpixely byla konstantní.



Subpixely jsou rozloženy pravidelně, ale pootočeny. Zde od 45°.
Výhodnější je ale pootočení o cca 25°.
Pokud je vzdálenost "a" mezi všemi vzorky stejná, je úhel pootočení ideální.


    Na rozdíl od OGAA dokáže RGAA (minimálně) 3x účinněji odstraňovat Alias na liniích blízkých vertikále a horizontále. Při těchto úhlech totiž OG nedokáže vlivem nevhodného rozložení využít všech subsamplů, protože dva a dva subsamply se překrývají. Pro lepší názornost si představte, jako byste se na rozložení vzorků dívali z boku. Při OG budou v zákrytu, kdežto při RG budou viditelné všechny(!), tudíž pracují taktéž všechny. Mohli byste namítnout, že pootočením o těch 25° jen posuneme tyto kritické úhly o právě těch 25°. To je pravda, ale jen zčásti. Aliasing je nejvíce zřetelný na úhlech blízkých horizontále a vertikále, naopak mezi úhly 20-30° (které jsou pro 25° RGAA kritický) příliš výrazný není. Což je velká výhoda. 45° RGAA sice není tolik účinný, jako 25° RGAA, ale kritický úhel je posunut právě na 45° a to je velká výhoda, protože úhel 45°(+-) AntiAliasing nepotřebuje. Podívejte na obrázek.



Nízké úhly, které nejvíce vyžadují AA jsem označil červeně. Okolí 25°, které AA tolik nepotřebuje jsem vyznačil modře a 45°, které AA nepotřebují vůbec zeleně.


Semi-Jittered subpixel Grid

    Společnost ATi vychází z předpokladu, že kritické úhly lze "vymýtit", pokud bude pozice některých vzorků generována náhodně. Tím se také zvýší účinnost AA a nebude zapotřebí tak vysokého množství vzorků. Výchozím bodem je OG plus náhodně vygenerované pozice vzorků. Např. tedy 4x OG a 4 náhodné vzorky. Pracuje se se čtveřicí pixelů. 3 pozice vzorků jsou zvoleny podle OG a místo čtvrté je použita jedna náhodná pozice (ze čtyřech předgenerovaných). V druhém pixelu je zase náhodným vzorkem nahrazen jiný "OG vzorek", atd.



Nejprve je vytvořena tabulka, která obsahuje pevně dané vzorky (pravidelné), i připravené (náhodně vygenerované).
Pro každý pixel je jeden "pravidelný" vzorek zaměněn za "náhodný".


Stochastic subpixel Grid

    Společnost ATi se možná snaží přiblížit idei 3Dfx, jejímž cílem byl tzv. Stochastic AntiAliasing, neboli naprosto náhodné rozmístění vzorků. Základním kamenem SAA je fakt, že implementace jakéhokoli pravidelného vzorku nemůže být naprosto úspěšná, protože lidské oko je na pravidelnost extrémně citlivé, tzn. že Alias je (víceméně) vždy jen převeden na jiné frekvence (podobně jako při použití vyšších rozlišení). Zároveň ale je pravdou, že implementace SAA je velice náročná, protože úplně každý pixel obrazu potom obsahuje úplně unikátní rozložení vzorků (při použití alespoň částečně pravidelných vzorků je možné vždy alespoň část výpočtů provést pro větší množství vzorků zároveň). Dalším kamenem úrazu je fakt, že při náhodném rozmístění může dojít i na takové pozice vzorků, které jsou řekněme nevhodné a mohou přinést do obrazu určité množství chyb. To by se ale dalo vyřešit, kdyby pro každý vzorek byl lokalizován v pixelu prostor, kde se MŮŽE vyskytovat, popř. kdyby byla po celé ploše pixelu stanovena jakási "mapa pravděpodobnosti" výskytu konkr. vzorku. Pak by tento algoritmus byl ideální. Podle výzkumu 3Dfx by bylo ideálního AntiAliasingu metodou SAA dosaženo při množství 16 (!) vzorků na pixel (tedy FSAA 16x), kdy by veškerý Aliasing byl převeden (díky nepravidelnosti vzorku) na bílý šum, ve kterém lidské oko již nedokáže zachytit žádné známky pravidelnosti a tedy ani pozůstatků Aliasu. Pokud se vám FSAA 16x zdá moc (zvlášť na dobu 3Dfx), tak vás mohu vyvést z omylu. Společnost Quantum 3D, která svoje grafické stanice a simulátory stavěla ne čipech 3Dfx režim 16x (ale RGAA) používala. Voodoo 4 umožňovala FSAA 2x, Voodoo 5 5500 4x, Voodoo 5 6000 8x a nadcházející Rampage (díky implementaci MultiSamplingu) 4x na čip, tedy 8x na dvojčipovou verzi!!! Další karta již měla obsahovat Stochastic AntiAliasing 16x (pravděpodobně na dva čipy). Zatímco dnes se radujeme, že dnešní karty jsou schopny běhat s FSAA 4x, který navíc (ať v případě ATi, nVidie, Matroxu či PowerVR) vychází z Ordered Grid.




Způsob aplikace

    Dále záleží na tom, zda je zpracován celý obraz, nebo jen některé části. Pokud jen určité části, tak dále rozlišujeme, které.

Edge AntiAliasing   Ovlivňuje jen hrany polygonů. Velice rozšířen. Pomalý, nekvalitní. Od Verité 1000, Voodoo...
Silhouette AntiAliasing   Ovlivňuje jen okraje objektů. Volari V3 a některé karty Tridentu
Fragment AntiAliasing   Obraz je podstoupen detekci Aliasu a ve vybraných částech je proveden AntiAliasing. Parhelia
Full-Scene AntiAliasing   AntiAliasing je proveden na celé obrazové ploše. Voodoo 4/5, GeForce 1/2/3/4, Radeon po 9200
Optimized FSAA   AntiAliasing je proveden na hranách polygonů, okrajích objektů atp. Od Radeon 9500 a GeForce FX


Jednotliví výrobci hardwaru implementují různé kombinace uspořádání vzorků a metod zpracování. Výsledkem jsou velké rozdíly v kvalitě a efektivnosti FSAA.






Předchozí Pokračovat...





© no-X 2004
akt. 07-02-2004
hlavní stránka