Supersampling

Supersampling (český ekvivalent nadvzorkování se nevžil) je metoda pro odstranění aliasingu používaná především v počítačové grafice.

Proces supersamplingu

  1. Snímek je vyrenderován ve větším rozlišení, než v jakém má být zobrazen.
  2. Přebytečné informace jsou využity k odstranění ostrých přechodů mezi pixely.

Typy supersamplingu

Supersampling je určen tím, jak velké rozlišení se použije, i jak z výsledného většího rozlišení získat cílový obraz. Existují různé typy supersamplingu, lišící se v tom, kde uvnitř pixelu jsou vzorky odebrány.

Každý z algoritmů výběru vzorků má své výhody a nevýhody. Mřížkový algoritmus (Grid) zajistí rovnoměrné a tedy „spravedlivé“ zastoupení všech částí z původního pixelu, ale vůči zbytkovému aliasingu je méně odolný než jeho pootočená varianta (Rotated Grid). Ta (a za ní Poisson Disc) má nejlepší výsledky právě v případech, kdy je otáčeno s původním nevyhlazeným obrazem – ostatní algoritmy s prvkem nahodilosti mohou při velmi jemných úhlech otáčení vytvářet na okrajích náhodné jednopixelové „zoubky“. Ale i náhodný výběr má své použití. Sice je nejméně „spravedlivý“ na zastoupení všech zákoutí původního pixelu, ale mezi jeho zvláštnosti patří to, že nejvíce zrní a tím emuluje stylový filmový „look“ (stejná náhoda vládne i tomu, které krystaly uvnitř filmové světlocitlivé vrstvy budou excitovány). Jeho výhodou je i to, že počet vzorků může být skutečně libovolný (u mřížkových algoritmů je druhou mocninou celého čísla). Například lze stanovit nikoli 9 ale 8 vzorků a poté, ve fázi průměrování, místo dělení devíti (dělení je pro procesor jedna z časově nejnáročnějších operací) provést bitový posun o 3 pozice doprava (bitový posun patří naopak mezi nejrychlejší instrukce). Algoritmus Jitter je kompromisem mezi pravidelností a nahodilostí, s tím, že náhodu dovoluje jen v pravidelných mezích (sektorech) původního pixelu. Poissonovo rozdělení dává též velmi dobré výsledky a není bez zajímavosti, že i v sítnici lidského oka jsou tyčinky a čípky rozmístěny s podobnou (ne)pravidelností, čímž (pro předměty a tvary na hranici rozlišení) pomáhají předcházet vnímání aliasingu.

Příklad

Máme například zobrazit na ploše 100×100 pixelů ciferník analogových hodin s přesným zobrazením hodinové a minutové ručičky – a to pouze pomocí běžných grafických procedur (jako např. vykreslení čáry nebo polygonu, které samy o sobě nepodporují antialiasing).

Hodinové ručičky nakreslíme v „pracovním“ rozlišení 200×200 pixelů. Na každý jeden cílový pixel tak vznikne malý blok 2×2 pixely. Tyto bloky lze zprůměrovat (tedy pixely bloku po jeho barevných složkách „slít“ do jednoho obrazového bodu) a výsledek dosadit na odpovídající místo v cílovém obrázku.

Vyšší rozlišení pro supersampling

Výše uvedený příklad se nazývá 2×2 supersampling (s typem výběru Grid) a patří mezi nejjednodušší a nejpoužívanější. Teoreticky by rozměry pracovní oblasti měly být „víc než dvojnásobné“, aby byl alias dostatečně potlačen, jak praví Shannonův/Nyquistův teorém. Rozlišení větší než 4×4násobek původní oblasti se ale ukazují jako neefektivní ve svém poměru výkon/čas.

Místo průměrování by šly použít i různé konvoluce (zejména pro vyšší násobky rozlišení), ale pokud by prvky konvolučních matic zasahovaly i bloků sousedních pixelů, vyústilo by to v určité rozostření (nebo, při vhodném nastavení konvoluční matice, přiostření) obrazu – a to i v místech, která by měla zůstat nezměněna. K rozostření původního obrazu může dojít i při průměrování, kdy rozměry pracovní oblasti nejsou celočíselnými násobky oblasti původní. Většinou se ale (pro zachování celkové jednoduchosti implementace) volí právě zvětšení o celočíselných násobcích původní oblasti – v opačném případě by průměrování každého pixelu bylo zatíženo počítáním váhových průměrů jak pro něj, tak pro pixely okolní.

Alternativa k supersamplingu a jejich porovnání

Alternativou k supersamplingu je naprogramovat vlastní nebo použít existující kreslící rutiny, které již samy o sobě podporují antialiasing. Například, rutina pro vykreslení úsečky u každého jejího bodu, který vykreslí a jenž je na pomezí více pixelů, průměruje jak tento pixel, tak i ty okolní. U některých řešení se dá antialiasing implementovat relativně jednoduše (např. u úsečky se šířko 1 pixelu lze míru zásahu do sousedního pixelu uchovávat v jednom čísle), u jiných (např. u kreslení obecného polygonu) se pro správnou funkčnost zachází do analytické geometrie. Tyto rutiny jsou obecně několikrát složitější a výkonnostně pomalejší než jejich „nevyhlazené“ verze, avšak po jejich vykonání již není potřeba výslednou plochu průměrovat, jako je tomu u supersamplingu. Co se týče celkového výkonu, nelze jednoznačně říci, která z metod je náročnější na procesorový čas.

Co se týče kvality, lze říci, že supersampling se dokonale vyhlazenému řešení bez aliasů bude vždy jenom limitně blížit, ovšem při dobrém nastavení a použití bude výsledek natolik dobrý, že lidské oko nepozná rozdíl.

Supersampling je oproti alternativám implementující antialiasing v každé rutině jednodušší. Ona jednoduchost se promítá v implementaci obou fází, velikosti a přehlednosti kódu (je-li úloha řešena jako program), orthogonalitě a všemi výhodami, které to s sebou přináší.

Nevýhodou supersamplingu jsou větší nároky na (video)paměť. Například typ 2×2 jí spotřebuje čtyřnásobek, typ 4×4 šestnáctinásobek. Pro současné grafické karty disponující obrovským výkonem a stovkami MiB videopaměti to pro většinu aplikací (včetně her) nebývá problém (a samy karty několik typů supersamplingu podporují nativně). Je však nutno si uvědomit, že nároky na paměť rostou kvadraticky s rozměrem cílové oblasti a renderování opravdu velké plochy (od řádově tisíců pixelů v jednom rozměru) se může ukázat jako neefektivní. Související nevýhodou supersamplingu je to, že jeho druhá fáze (průměrování) probíhá i na místech, kde není potřeba. V limitních případech stráví procesor téměř všechen čas přepočítáváním pixelů, které ve výsledku zůstanou stejné. Tomu lze předejít monitorováním, které oblasti byly překresleny, a ty pak průměrovat. Tento přístup ale ztrácí původní jednoduchost a navíc vyžaduje další paměť. Naopak, pro malé oblasti, jež mají být vyrendrovány touto metodou, může být supersampling rychlejší než cokoli jiného.

Celkově supersampling má svoje opodstatnění, nabízí jednoduchý (téměř primitivní) způsob dosažení antialiasingu oproti jiným metodám, ale měl by být používán v případech, kdy je ke svému účelu nejvhodnější.

Použití jinde než v počítačové grafice

Princip, který supersampling používá, je natolik obecný, že lze aplikovat i do ostatních oblastí, které získávají data vzorkováním. Při editaci zvuku – například zvukař, který má připravit zvuky, jež budou ve své výstupní frekvenci omezeny 11 kHz (třeba s ohledem na jejich velikost nebo cílové zařízení), s nimi bude do poslední chvíle operovat v „pracovní“ vzorkovací frekvenci (typicky 48 nebo 96 kHz) a frekvenci omezí až na konci, při ukládání. Výsledek pak bývá o poznání lepší, než kdyby ve výstupní frekvenci pracoval od začátku.

Související články

Média použitá na této stránce

JitterSS.png
Supersampling method "Jittering"
PoissonSS.svg
Supersampling method "Poisson disc"
RandomSS.svg
Supersampling method "Random samples"
GridSS.svg
Autor: Amit6, Licence: CC BY-SA 3.0
Supersampling method "Regular grid"