Takéantialiasing, AAPokročilý

Definice

Anti-aliasing je soubor technik, které omezují zubaté hrany a třepení detailů vznikající při převodu spojitého obrazu na mřížku pixelů. V grafice barvy na hranách obvykle průměruje nebo vzorkuje vícekrát, aby diagonály, text a 3D modely působily plynuleji, i když za cenu výkonu nebo mírné ztráty ostrosti.

Kategorie: Grafické programováníAktualizováno

Nezaměňujte: V počítačové grafice anti-aliasing potlačuje zubaté hrany obrazu, zatímco ve zpracování signálu znamená obecně filtrování před vzorkováním proti vzniku aliasingu.

Proč šikmá čára zubatí

Anti-aliasing řeší rozdíl mezi spojitým tvarem a rastrem displeje. Kruhová ikona, písmo nebo hrana 3D modelu může procházet pixelovou mřížkou pod libovolným úhlem, ale výsledný obraz se skládá z konečného počtu čtverečků. Bez vyhlazení se každý pixel rozhodne příliš tvrdě: buď patří k objektu, nebo k pozadí. Lidské oko potom vidí schody, třpytivé tenké linky nebo neklidné obrysy při pohybu kamery.

Vzorkování barvy na hraně

Základní myšlenka anti-aliasingu je odhadnout, jak velká část pixelu leží uvnitř tvaru, a podle toho namíchat barvu popředí a pozadí. Pixel na hraně tedy nemusí být čistě černý nebo čistě bílý, může být šedý, případně kombinovat více barev a průhlednost. Praktické metody se liší tím, kde a kolikrát obraz vzorkují.

  • SSAA renderuje scénu ve vyšším rozlišení a potom ji zmenší. Výsledek bývá kvalitní, ale drahý na výkon i paměť.
  • MSAA vzorkuje pokrytí hran vícekrát uvnitř pixelu, typicky u geometrie. Ve hrách zlepšuje siluety objektů, ale neřeší všechny efekty v shaderu.
  • FXAA a podobné filtry pracují až nad hotovým snímkem. Bývají rychlé, ale mohou změkčit textury nebo text.
  • TAA skládá informaci z více snímků. Pomáhá proti blikání v pohybu, ale při špatném nastavení může zanechat duchy za objekty.

Anti-aliasing v prohlížeči a GPU pipeline

Prohlížeč obvykle vyhlazuje písmo, SVG a běžné 2D tvary automaticky, protože jinak by webové rozhraní působilo hrubě. U elementu canvas se vývojář často setká s vlastností imageSmoothingEnabled. Tato vlastnost řídí hlavně vyhlazování při škálování bitmap, nikoli univerzální vypínač pro každou vykreslenou čáru.

V grafickém API se anti-aliasing řeší přes formát framebufferu, počet vzorků, rasterizaci a pozdější post-processing. WebGL nebo OpenGL mohou nabídnout multisampling, ale dostupnost a kvalita závisejí na ovladači, zařízení, formátu render targetu a nastavení kontextu.

Kompromis mezi hladkou hranou a přesným detailem

Anti-aliasing není automaticky lepší ve všech situacích. U fotografického obrazu, 3D scény a moderního písma většinou zvyšuje vizuální kvalitu. U pixel artu, technických rastrů, QR kódů nebo velmi ostrých UI ikon může interpolace poškodit záměr: hrany se rozmažou, kontrast klesne a malé detaily přestanou být čitelné.

Volba metody proto závisí na obsahu. Statický render může obětovat čas pro SSAA, hra často volí MSAA, TAA nebo post-process filtr podle rozpočtu GPU. Webová aplikace může naopak cíleně vypnout smoothing u bitmap, které mají zůstat hranaté.

Praktický dopad v návrhu rozhraní

Anti-aliasing ovlivňuje nejen estetiku, ale i použitelnost. Jemné ikony, malé písmo a tenké linky potřebují dostatečný kontrast, správné zarovnání na pixelovou mřížku a testování na různých hustotách displeje. Vyhlazení skryje část zubatosti, ale nenahradí dobře zvolenou velikost, tloušťku tahu ani kvalitní vektorový zdroj.

Příklady z praxe

  1. Pixel art v canvasu

    Webová hra zvětšuje 16×16 pixelový sprite na velkou postavu v canvasu. Při zapnutém vyhlazování se pixely rozlijí do okolí a sprite ztratí retro styl. Vypnutí smoothingu zachová ostré bloky a výsledný obraz odpovídá pixel artu.

    const ctx = canvas.getContext('2d');
    ctx.imageSmoothingEnabled = false;
    ctx.drawImage(sprite, 0, 0, 160, 160);
  2. Multisampling ve WebGL scéně

    WebGL vizualizace zobrazuje šikmé hrany 3D modelu proti světlému pozadí. Kontext požádá prohlížeč o antialiasing a na podporovaném zařízení se obrys modelu přestane výrazně schodovat. Aplikace přesto ověří atribut kontextu, protože konkrétní GPU nebo prohlížeč nemusí požadavek splnit.

    const gl = canvas.getContext('webgl2', { antialias: true });
    console.log(gl?.getContextAttributes().antialias);

Časté omyly

MýtusZapnu anti-aliasing a grafika bude vždycky ostřejší.
Ve skutečnostiAnti-aliasing obvykle zlepší plynulost hran, ale ostrost může naopak snížit. U drobných detailů, textu nebo pixel artu může nevhodné vyhlazování vytvořit měkký a méně čitelný výsledek.
MýtusimageSmoothingEnabled vypíná antialiasing celého canvasu.
Ve skutečnostiVlastnost imageSmoothingEnabled se týká hlavně vyhlazování při kreslení a škálování bitmap přes drawImage. Prohlížeč může dál vyhlazovat vektorové tvary nebo text jinými mechanismy.

Časté dotazy

Proč anti-aliasing někdy obraz rozmaže?
Anti-aliasing obraz rozmaže, když metoda míchá barvy příliš agresivně nebo když filtr pracuje nad hotovým snímkem bez znalosti skutečné geometrie. Post-process filtry mohou vyhodnotit jemný detail jako zubatou hranu a změkčit ho. Rozmazání je zvlášť vidět u malého textu, tenkých vzorů, pixel artu a uživatelských rozhraní s nízkým kontrastem.
Kdy má smysl vypnout anti-aliasing u pixel artu?
Anti-aliasing u pixel artu má smysl vypnout při zvětšování malých bitmap, které mají zůstat složené z viditelných čtvercových pixelů. Interpolace mezi sousedními barvami vytváří mezitóny, které autor do grafiky nezamýšlel. Webové hry, editory sprite grafiky a retro UI proto často používají nejbližší sousední vzorek místo hladkého škálování.
Proč MSAA nezlepší všechny zubaté hrany ve hře?
MSAA zlepšuje hlavně hrany vzniklé rasterizací geometrie, protože uvnitř pixelu vzorkuje pokrytí trojúhelníkem vícekrát. Moderní hra ale obsahuje i průhledné textury, odlesky, stíny, shaderové vzory a post-processing. Tyto zdroje aliasingu nemusí MSAA zachytit, proto se často kombinuje s TAA, vyšším rozlišením nebo speciálními filtry pro konkrétní efekt.
Je anti-aliasing stejný jako vyšší rozlišení?
Vyšší rozlišení a anti-aliasing řeší podobný problém, ale nejsou totéž. Vyšší rozlišení zmenší pixely, takže zubatost je méně nápadná. Anti-aliasing se snaží lépe odhadnout barvu hran i při daném rozlišení. Supersampling obě myšlenky spojuje: scéna se spočítá ve vyšším rozlišení a potom se kvalitně zmenší na cílový obraz.

Zdroje

  1. CanvasRenderingContext2D: imageSmoothingEnabled property(otevře se v novém okně)MDN Web Docs
  2. Multisampling(otevře se v novém okně)Khronos Group
  3. HTML Standard(otevře se v novém okně)WHATWG
  4. Spatial anti-aliasing(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.