Anti – Aliasing Ondřej Burkert atrey.karlin.mff.cuni.cz/~ondra/stranka
Úvod Co je to anti - aliasing ? Aliasing = vznik artefaktů v důsledku podvzorkování při vzorkování (sampling) obrazu Aliasing = vznik artefaktů v důsledku podvzorkování při vzorkování (sampling) obrazu podvzorkování = příliš vysoká frekvence dat vzhledem k vzorkovací frekvenci podvzorkování = příliš vysoká frekvence dat vzhledem k vzorkovací frekvenci vzorkovací frekvence musí být alespoň 2x větší než frekvence dat (Shannonův teorém) vzorkovací frekvence musí být alespoň 2x větší než frekvence dat (Shannonův teorém) podvzorkování způsobuje rušivé efekty (jaggies, Moire) podvzorkování způsobuje rušivé efekty (jaggies, Moire) Anti – aliasing Anti – aliasing metody na odstranění nesrovnalostí způsobených podvzorkování metody na odstranění nesrovnalostí způsobených podvzorkování Techniky Techniky no – filter no – filter pre - filtering pre - filtering post - filtering post - filtering uniformní uniformní Stochastický – Jitter Stochastický – Jitter
Techniky Pre-filtering Pre-filtering intenzita/barva pixelu se spočítá přes zastoupení jednotlivých segmetů v pixelu váženo plouchou, kterou zabírají intenzita/barva pixelu se spočítá přes zastoupení jednotlivých segmetů v pixelu váženo plouchou, kterou zabírají výpočetně náročné výpočetně náročné Uniformní post-filtering Uniformní post-filtering zvýšení vzorkovací frekvence (rozlišení) zvýšení vzorkovací frekvence (rozlišení) filtrace filtrace rekonstrukce rekonstrukce nevýhody nevýhody špatné pro malé objekty špatné pro malé objekty paměťové nároky paměťové nároky problém jen odsunut do vyšší frekvence problém jen odsunut do vyšší frekvence výhody výhody jednoduchá implementace jednoduchá implementace
Stochastický post - filtering pozice vzorků je náhodně pozměněna (jitter) pozice vzorků je náhodně pozměněna (jitter) lidské oko lépe vnímá šum než aliasing lidské oko lépe vnímá šum než aliasing nevýhody nevýhody nefunguje dobře u paralelních výpočtů nefunguje dobře u paralelních výpočtů výhody výhody vyšší frekvence nahrazeny šumem vyšší frekvence nahrazeny šumem rychlejší rychlejší
Algoritmy pro kreslení přímky Gupta-Sproull Gupta-Sproull Fujimoto-Iwata Fujimoto-Iwata Xiaolin Wu Xiaolin Wu
Obecné předpoklady Oba popisované algoritmy předpokládají náležení přímky do prvního oktanu Oba popisované algoritmy předpokládají náležení přímky do prvního oktanu To se snadno zařídí prostřednicvím symetrií To se snadno zařídí prostřednicvím symetrií
Gupta – Sproull (1981) Algoritmus pracuje s konvolučním filtrem tvaru kužele (další varianty krychle, Gaussian) Algoritmus pracuje s konvolučním filtrem tvaru kužele (další varianty krychle, Gaussian) Tvar kužele zvolen, vzhledem k chování CRT monitoru Tvar kužele zvolen, vzhledem k chování CRT monitoru Střed kužele je roven středu počítaného pixelu, intenzita barvy pixelu závisí na ploše průniku kužele a kreslené přímky Střed kužele je roven středu počítaného pixelu, intenzita barvy pixelu závisí na ploše průniku kužele a kreslené přímky Ve sloupci jsou 3 pixely Ve sloupci jsou 3 pixely Výpočet se urychluje předpočítáním si tabulky hodnot pro jednotlivé druhy průmětů, tabulka je parametrizovaná úhlem a vzdáleností Výpočet se urychluje předpočítáním si tabulky hodnot pro jednotlivé druhy průmětů, tabulka je parametrizovaná úhlem a vzdáleností
… Algoritmus hodně záleží na volbě velikosti konvolučního filtru a stupňů intenzity Algoritmus hodně záleží na volbě velikosti konvolučního filtru a stupňů intenzity Další možné vylepšení: readback Další možné vylepšení: readback Barva pixelu je zohledněna i vzhledem k barvě pozadí a okolních pixelů Barva pixelu je zohledněna i vzhledem k barvě pozadí a okolních pixelů Řeší rozumně protínání přímek Řeší rozumně protínání přímek Hodně časově náročné – časté přístupy do paměti Hodně časově náročné – časté přístupy do paměti
Příklady vlivu nastavení
Wu’s algorithm (1991) Mnohem jednodušší a efektivnější než Gupta-Sproull Mnohem jednodušší a efektivnější než Gupta-Sproull Založen na úpravě Bresenhamova algoritmu pro kreslení přímky Založen na úpravě Bresenhamova algoritmu pro kreslení přímky Snadno implementovatelný i hardwarově Snadno implementovatelný i hardwarově Používá proměnou určující vzdálenost středu pixelu od středu přímky k určení intenzity/barvy Používá proměnou určující vzdálenost středu pixelu od středu přímky k určení intenzity/barvy Kreslí místo jednoho pixelu dva, součet intenzity dává jedna Kreslí místo jednoho pixelu dva, součet intenzity dává jedna Vystačí s operacemi sčítání a bitovými posuny Vystačí s operacemi sčítání a bitovými posuny
Nástin algoritmu I(x0,y0)=I(x1,y1)=I; //pocatecni body I(x0,y0)=I(x1,y1)=I; //pocatecni body D=0; D=0; d=[k2^n+0.5]; //dolni cela část, de facto obdoba DDA algoritmu d=[k2^n+0.5]; //dolni cela část, de facto obdoba DDA algoritmu while (x0<x1){ //postupuji z obou stran dokud nedojdu doprostřed while (x0<x1){ //postupuji z obou stran dokud nedojdu doprostřed x0+=1; x0+=1; x1-=1; x1-=1; D+=d; D+=d; if (D overflow){ if (D overflow){ //D presahne mez, posunu linku o pixel nahoru po souradnici y //D presahne mez, posunu linku o pixel nahoru po souradnici y y0+=1; y0+=1; y1-=1; y1-=1; } } I(x0,y0)=I(x1,y1)=D div 2^(n-m); //prvnimu pixelu jeho stupen sedi I(x0,y0)=I(x1,y1)=D div 2^(n-m); //prvnimu pixelu jeho stupen sedi //n je pocet bitu D, m je pocet stupnu sedi //n je pocet bitu D, m je pocet stupnu sedi //intenzita je dana m nejvyznamejsimi bity D //intenzita je dana m nejvyznamejsimi bity D I(x0,y0+1)=I(x1,y1-1)=I(x0,y0) doplnek; I(x0,y0+1)=I(x1,y1-1)=I(x0,y0) doplnek; //druhemu priradim komplement hodnoty prvniho pixelu //druhemu priradim komplement hodnoty prvniho pixelu //I(x,y)=i putpixel(x,y,i)i..intenzita pixelu //I(x,y)=i putpixel(x,y,i)i..intenzita pixelu }} }}
Dodatky k algoritmu D … diference je reálné číslo s fixní desetinnou čárkou a velikostí rovnou velikosti slova stroje D … diference je reálné číslo s fixní desetinnou čárkou a velikostí rovnou velikosti slova stroje d … posun vzhledem k ose y (posun k x je 1) d … posun vzhledem k ose y (posun k x je 1) Konce přímek: v případě neceločíselných hodnot počátku a konce… pomocí poměrného přesahu poslední integerové hodnoty x-ové soořadnice Konce přímek: v případě neceločíselných hodnot počátku a konce… pomocí poměrného přesahu poslední integerové hodnoty x-ové soořadnice Přímky kratší jednoho pixelu – intenzita určena poměrem délky a velikosti pixelu Přímky kratší jednoho pixelu – intenzita určena poměrem délky a velikosti pixelu
Srovnání Gupta-Sproull x Wu Gupta-Sproull Gupta-Sproull Lepší výsledky Lepší výsledky Přímky jsou trochu rozmazanější Přímky jsou trochu rozmazanější Výpočetně náročné (výpočet tabulky) Výpočetně náročné (výpočet tabulky) Neošetřuje konce přímek Neošetřuje konce přímek Wu Rychlejší Jednodušší (jen přičtení a bitový posun) Benchmark data: Pentium III 450Mhz, Visual C Release Build, Default Maximum Speed Optimization... AlgorithmLines Drawn (x1000) (s) Lines Per Sec DDA Bresenham Wu EFLA Variation E
Využití Oba algoritmy se dají s úspěchem použít i na vykreslování anti-aliasovaných kružnic a elips, pro vykreslování polygonů je třeba algoritmy příslušně upravit. Oba algoritmy se dají s úspěchem použít i na vykreslování anti-aliasovaných kružnic a elips, pro vykreslování polygonů je třeba algoritmy příslušně upravit. Při vykreslování na obrazovku se občas používá několik algoritmů a jejich nastavení najednou a postupně se zlepšuje kvalita obrazu Při vykreslování na obrazovku se občas používá několik algoritmů a jejich nastavení najednou a postupně se zlepšuje kvalita obrazu
Oblasti využití Prakticky ve všech oblastech grafiky Prakticky ve všech oblastech grafiky Fraktály Fraktály Renderování polygonů Renderování polygonů Ray – tracing Ray – tracing Mapování textur Mapování textur Video (blur) Video (blur) Temporary antialiasing Temporary antialiasing
Zdroje Graphic Gems III., s Graphic Gems III., s Fundamental Algorithms for Computer Graphics, s Fundamental Algorithms for Computer Graphics, s Computer Graphics, July 1991 Computer Graphics, July 1991 Computer Graphics Techniques, Computer Graphics Techniques, asing.html asing.html asing.html asing.html