Anizotropní filtrace a Anti-Aliasing
Texturovací jednotky a anizotropní filtrace
Nvidia se v rámci prezentace ani oficiálních materiálů explicitně o texturovacích jednotkách ani anizotropní filtraci nezmiňuje, přesto se na obojí v krátkosti podíváme. Podle dosavadních výsledků našich testů se zdá, že texturovací jednotky zůstaly po funkční stránce identické jako v případě Fermi. Konkrétně máme na mysli GeForce GTX 460 / 560 / 580, protože původní GTX 480 se lišila výkonem při filtraci FP16 textur. V tomhle ohledu jsou oba výrobci poměrně nejednotní: Nvidia podporuje (a podporovala) full-speed FP16 filtraci na čipech GF104, GF114 a GF110 (resp. od generace Fermi mimo původní GF100), AMD/ATI zase na čipech generace R600 / RV670 (na novějších je podpora half-speed, tedy s polovičním výkonem oproti rozšířenější Int8 filtraci).
V rámci Nvidie se ale ve srovnání s předešlou generací nic nemění. Totéž platí i pro kvalitu anizotropní filtrace:
AMD Tahiti (HD 7000) |
Nvidia GK104 (GTX 680) default |
Nvidia GK104 (GTX 680) high-quality |
---|---|---|
pro objektivní porovnání rozklikněte na plnou velikost (PNG)
Nvidia na default používá jako základ brilineární filtr, mip-mapping a filtrace jsou mírně úhlově optimalizované (stejnou měrou jako u Fermi). V režimu high-quality je použit plný trilineární filtr, úhlové optimalizace zůstávají. Jsou ale mírné, takže rozdíly oproti konceptu AMD, který je těchto optimalizací zcela prostý, byste v praxi zřejmě museli hledat lupou. Samotný koncept úhlových optimalizací je spíše než cestou k navýšení výkonu nástrojem k úspoře tranzistorů.
Anti-Aliasing
Jak je v posledních letech zvykem, není MSAA (multi-sampling) jediným režimem, který výrobci nabízejí. Je však stále jedinou metodou, která je vyžadovaná ze strany DirectX (konkrétně od DirectX 10, respektive 10.1). Čím více her a aplikací existuje, tím více problémů vzniká a tím více nových režimů (ať již prostřednictvím ovladačů nebo hardwaru) oba výrobci implementují.
Nebude na škodu, když si některé z problémů (či specifických situací) i způsobů jejich řešení připomeneme:
Starší a nenáročné hry
Pokud hra běží na 200 FPS i s MSAA 8×, pak je škoda dostupného výkonu nevyužít pro nějaký způsob zlepšení obrazové kvality. Nvidia i AMD pro tyto situace nabízejí SSAA (super-sampling), který byl dříve běžný (jako první ho plně hardwarově a ve vynikající kvalitě podporovala 3Dfx), ale který později na řadu let kvůli vyšším výkonnostním požadavkům upadl v zapomnění. Super-sampling je nejen přesnější, ale má pozitivní vliv také na textury. Podle konkrétního nastavení buďto může snížit úroveň moaré a shimmeringu na texturách, nebo umožnit použití záporných faktorů LOD (v praxi mírně lepší kresba textur).
Pro méně náročné hry implementovala ATI před lety (počínaje DirectX 10 generací hardwaru) ještě navíc metodu programovatelných filtrů, která umožnila dosáhnout vyššího vyhlazovacího výkonu. Stručně: Na rozdíl od běžného multi-samplingu (využívá box filtr), který aliasing převádí na vyšší frekvence, fungoval tzv. tent-filtr tak, že aliasing nejen převedl na vyšší frekvence, ale ty ještě následně z obrazu ořezal. Výsledkem byl daleko hladší obraz, ovšem s mírným dopadem na ostrost textur (pokud nesly detaily na frekvencích, které byly závěrem ořezány). Druhý režim nabízel rozšířený edge-detect algoritmus, který popsaný způsob vyhlazení realizoval pouze na hranách polygonů, takže ostrost nesnížil. AMD oba režimy postupem času vypustila z oficiálních specifikací nových karet. Zmiňujeme je ale z určitého důvodu, ke kterému se postupně dostaneme.
Příliš náročné hry
Druhý problém nastává, když hra při požadované úrovni vyhlazování neběží dostatečně rychle. Nejen pro tyto situace slouží režimy Nvidia CSAA či obdoba AMD zvaná EQAA. Ty kombinují MSAA vzorky s datově méně náročnými vzorky, které pouze zjišťují vykrytí a umožňují realizovat vyšší úroveň vyhlazení s nízkými nároky na paměť a sběrnici.
Opět tu zmíníme ještě jednu starší metodu: ATI jí nazývala temporální anti-aliasing, ale bylo možné ji použít už na hardwaru 3Dfx. Fungovala na principu střídání odlišného rozložení AA-vzorků mezi sudými a lichými obrazovými snímky. Pokud byl framerate dostatečně vysoký, vypadal výsledek jako při 2× vyšší úrovni anti-aliasingu.
Hry s post-processing efekty a HDR
Protože se vyhlazování provádí v lineárním prostoru, ale některé hry využívají efekty, které nejsou realizované v lineárním prostoru, přichází na scénu další porce problémů. V lepším případě je anti-aliasing méně účinný, v horším může způsobit artefakty.
Problém se projevuje při klasickém postupu renderingu, kdy je vykreslen obraz s MSAA, proveden resolve (zpracování MSAA vzorků na výsledné pixely) a poté tone-mapping (používaný při řadě HDR efektů).
pokud je nejprve proveden MSAA resolve (vlevo), vytvoří následný tone-mapping artefakty (vpravo)
(c) Jawed, Beyond3D forum
Výše uvedená simulace ukazuje, jaký artefakt může vytvořit lineární MSAA s následným nelineárním zpracováním. Řešením tedy je nejdříve provést tone-mapping a teprve poté MSAA resolve. To ovšem hardware nemusí podporovat - pak je třeba použít emulovaný resolve (který neprovádějí ROP jednotky, ale unifikované jádro), což obvykle stojí nějaký výkon navíc.
Deferred shading / G-Buffers
Poslední zádrhel, na který se podíváme, přinesl Unreal Engine 3. Ten využívá (do té doby) silně atypický postup při renderingu: V první fázi je renderováno do specifických textur zvaných G-Buffers, do nichž jsou zakódovány veškeré informace pro další zpracování. Když je výsledný obraz z G-Buffers poskládán a na konci pipeline by měl být proveden anti-aliasing, nestane se nic. Z-Buffer, který je pro to třeba, totiž už neexistuje, zanikl po vykreslení G-Buffers.
Řešením je vykreslovat s anti-aliasingem již do G-Bufferů (za použití shader-resolve), ovšem pokud daná hra poté aplikuje nějaké nelineární obrazové efekty, dochází k problému, který jsme popsali v předchozí kapitolce. Obvykle sice nejde o tak dramatické artefakty, spíš je kvalita vyhlazení degradována a vypadá jako by byla u několik úrovní nižší.
Vzniká situace, kdy se nakupilo několik problémů, které vzájemně komplikují své řešení. Nejsnazší by sice bylo, kdyby vývojáři her použili metody kompatibilní s běžným multi-samplingem. Nežijeme ale v dokonalém světě a je tedy třeba problém přijmout a hledat alternativní řešení: Tím je použití zcela odlišného konceptu anti-aliasingu, který nevychází primárně z geometrických dat jako MSAA, ale z analýzy již vykresleného obrazu.
Ať už FXAA Nvidie nebo MLAA od AMD, obojí jsou metody založené na adaptivním post-processingu. Obrazový snímek je vykreslen bez anti-aliasingu a poté proběhne jeho analýza, která vyhledává vše, co působí jako aliasing a provádí náhradu daných částí obrazu vyhlazenými.
I když tyto metody nejsou zcela korektní a mají svoje mouchy, dávají v řadě případů uspokojivé výsledky. Pokud hra neumožňuje použít MSAA nebo post-processing efekty jeho účinnost (či kvalitu) degradují, jsou obvykle metody FXAA či MLAA nejefektivnějším řešením.
FXAA
Nvidia z výše popsaných důvodů dál pracuje na optimalizacích režimu FXAA, který se dočkal určitých vylepšení. Samotná implementace je nyní univerzálnější a přístupná z ovládacího panelu. Protože jde o změny softwarového charakteru, může být nová verze FXAA principielně podporována i na Fermi a podle příslibu Nvidie i bude. Následující ukázky prezentují, jaký přínos může mít FXAA v případě, kdy MSAA nefunguje korektně (všimněte si, že s MSAA má spodní hrana pod výřezem v levé části světlejší odstín, než jaký má pozadí a naopak horní přechází do příliš tmavé fialové - obojí je důsledkem nesprávného pořadí při renderingu MSAA resolve-> tone-mapping):
TXAA
Kromě FXAA přichází ještě druhá novinka. Ta je ale trochu odlišná:
- TXAA vyžaduje podporu ze strany aplikace
- TXAA je implementovaný softwarově, takže by mohl být podporovaný i na Fermi (zatím to však Nvidia nepotvrdila)
- TXAA je kombinací MSAA, filtrace a (volitelného) temporálního AA
U posledního bodu se na chvilku zastavíme. Podle Nvidie má klasický MSAA v případě některých enginů příliš vysoké nároky, ale přesto přináší dobrou kvalitu obrazu. TXAA proto zakládá na nižších úrovních MSAA (konkrétně 2× či 4×, díky čemuž se velikost G-Bufferů drží na přijatelné úrovni) a pro zvýšení účinnosti používá filtry. Nvidia nespecifikovala konkrétní typ filtru, ale zmínila, že dochází k poklesu ostrosti, takže je možné, že půjde o něco obdobného jako bývaly tent-filtry ATi/AMD. K tomu je navíc použitý ještě volitelný temporální anti-aliasing, tedy střídání polohy vzorků mezi jednotlivými snímky.
- TXAA 1 ⇒ zakládá na MSAA 2×
- TXAA 2 ⇒ zakládá na MSAA 4×
Prozatím je tuto metodu předčasné globálně hodnotit, uvidíme až na konkrétních hrách. Oficiální ukázky demonstrují, co se dá na základě popisu očekávat: Vyšší úroveň vyhlazení na úkor určitého snížení ostrosti.
Prakticky s jistotou ale můžeme říct, že TXAA bude podporované v rámci Unreal 4 Engine (nepřímo to potvrdil Mark Rein, vice president of Epic Games). Dále Nvidia plánuje na rozšíření TXAA spolupracovat s následujícími studii:
Nvidia (prezentace v San Franciscu a oficiální materiály)