Няма нужда да ви описвам какво представлява алайзингът, но нека все пак да го кажа с две думи – това са визуални артефакти при представянето на аналогова по същността си визуална информация върху дискретно, цифрово визуализиращо устройство. Или казано на по-прост език – назъбванията при изобразяване върху цифрови дисплеи. За съжаление и в наши дни това остава един от сериозните визуални проблеми, въпреки че през последните няколко години разделителната способност на дисплеите рязко нарасна, а размера на пикселите стана по-малък. Антиалайзинг пък е събирателното име на методите са борба с алайзинга. В тази статия мисля да направя нещо, което не съм правил от години, а именно да ви занимая със сравнение на качеството на най-новите навлезли режими на антиалайзинг, както и с производителността им.
Актуални видове антиалайзинг
Суперсемлиране (SSAA) – това е може би най-старият вариант на антиалайзинг. При него в рамките на пиксела се тестват два или повече семпъла, като всеки от тях се прекарва през целия графичен конвейер, като се събира текстурна, Z, stencil информация, изпълняват се пикселните шейдери и т.н. По същество може да се каже, че представлява рендиране на изображението с толкова пъти повече пиксели, колкото семпъла се ползват и скалирането му обратно до екранната разделителна способност. Благодарение на това суперсемплирането изглажда на практика всеки пиксел от екрана независимо от геометричната информация, използването на прозрачни текстури и т.н., като заедно с това има известна роля във филтрирането на високочестотните шумове в изображението (т.нар. „пясък“, който се забелязва при движение във високо детайлни, контрастни текстури). Благодарение на последното е възможно да се използват по-агресивни настройки на LOD Bias при филтрирането на текстурите и съответно изображението да изглежда по-рязко. Суперсемплирането дава най-високо качество на картината, но за сметка на огромен преразход на изчислителни възможности.
Мултисемплиране (MSAA) – този метод е оптимизация на суперсемплирането, като цели да намали загубата на производителност. При този метод се взимат текстурни данни и се изпълняват пикселни шейдери само за един семпъл в центъра на пиксела, като се тества и броят на засичащите се в рамките на пиксела полигони. Ако в него попадат данни от 2 или повече полигона, които са едновременно видими (един от полигоните не покрива изцяло останалите), се прилагат 2 или повече отчета на Z/stencil информацията, които след това се използват за изчисление на крайния резултат на цвета на пиксела. По този начин антиалайзингът се прилага само по ръбовете на обектите, където обикновено е и най-нужен, като в същото време заема по-малко памет и натоварва по-слабо графичния конвейер. Използването на повече семпли подобрява качествата му за сметка на относително по-малка загуба на производителност в сравнение със суперсемплирането и като цяло дава достатъчно прилично изображение.
По тази причина това е и най-масово използвания към момента метод за антиалайзинг. В същото време той има и някои характерни недостатъци, като най-сериозния от тях е, че няма ефект върху текстурите, което е особено голям проблем при използването на частично прозрачни текстури, тъй като ръбовете на образуваните от тях форми принадлежат към един полигон и съответно не се филтрират. По тази причина използването на MSAA не е от особена полза, когато в игрите се използват визуално сложни текстури, които да имитират геометрия. За щастие в наши дни използването на подобни ефекти намалява, поради нарасналите геометрични възможности на графичните адаптер и използването на теселация. Заедно с това MSAA е доста неудобен за реализация при използването на differed shading графични енджини, които обработват геометрията в отделен пас от осветяването и прилагането на пикселните шейдери. По тази причина се налага да се пазят допълнителни буфери със Z/stencil информация от геометричния пас или изобщо не се реализира AA в рамките на енджина. Предимството на differed shading енджините е в създаването на много по-реалистично осветяване на сцените в сравнение с класическите енджини.
Adaptive AA/Transparency AA – за да се борят с проблемите на MSAA с прозрачните текстури, двете основни графични компании предлагат собствени алгоритми, които да го усъвършенстват. Реализацията им се различава на хардуерно ниво, но по същество правят едно и също нещо – при генериране на изображението се провежда допълнително тестване на алфа-канала на текстурата (този който отговаря за прозрачността) и при изпълняване на дадени условя се прави локален суперсемплинг или мултисемплинг. По този начин могат да се изглаждат ръбовете и в прозрачни текстури, като все пак не се обработва изцяло изображението. Естествено това води до загуба на производителност спрямо MSAA. Предвид нарасналата мощност на съвременните адаптери, в наши дни се ползва преди всичко суперсемплиране в случаите на прозрачни текстури. За съжаление тези методи на АА запазват проблемите на MSAA със differed shading енджините, което понякога води или до деактивирането им в този случай, или до драстичен спада в производителността.
„Палаткови“ филтри – този тип оптимизации не засяга броя на тестваните семпли, като за сметка на това комбинира за изчисляването на крайния резултат и такива от съседни пиксели. Името идва от начина по който изглежда избраната зона за селекция на семпли – като двумерна проекция на палатка. Една от първите подобни реализации е Quincunx филтъра въведен от NVidia GeForce 3, който прилага 2х мултисемплиране във всеки пиксел, но крайния резултат се образува като се взима предвид и стойността на по един семпъл от 3 други съседни пиксела. По-късно с появата на Radeon HD 2900 ATI се възползваха от бързата връзка между растерните оператори и пикселните шейдери, за да внедрят собствени палаткови филтри, тъй като в R600 АА така или иначе се изчисляваше с помощта на изчислителните блокове. Този тип филтриране разчита на това, че с крайния резултат се базира на голям брой семпли, докато в рамките на пиксела се обработват по-малко на брой и по този начин намалява натоварването на растерните оператори и шината на паметта. Заедно с това използването на семпли от съседните пиксели филтрира в известна степен и алайзинга възникнал при прозрачни текстури, без при това да се налага използването на ААА/ТАА. По-същество този тип филтри са просто леко усложнени blur филтри, което за съжаление неизбежно се отразява на крайния резултат – наистина изглаждането на ръбовете е по-добро и се филтрират и прозрачните текстури, но това е за сметка на цялостна загуба на детайлност на текстурите и шейдерите. В наши дни и двете компании са се отказали от прилагането им.
Edge AA – този тип АА е близък роднина на палатковите филтри от гледна точка на това че крайния резултат се комбинира в пикселните шейдери, но за разлика от тях не се обработва цялото изображение. Този тип АА отново се базира на MSAA, но за разлика от палатковите филтри търси границите на полигоните и в техните рамки прилага драстично увеличен брой семпли, като заема и от съседните пиксели. Благодарение на това практически липсва загубата на детайлност на текстурите, а качеството на изглаждане на ръбовете на полигоните е на изключително високо ниво. В същото време този алгоритъм е доста „скъп“ от изчислителна гледна точка и няма ефект върху прозрачните текстури. В момента се прилага единствено в адаптерите на AMD.
Coverage Sample AA/Enhanced Quality AA – тези два метода отново правят практически едно и също, но са различни хардуерни реализации от двата основни производителя на графични карти. Nvidia първи въведоха CSAA, а от AMD ги последваха доста по-късно, едва с последното поколение. По същество това е още едно усъвършенстване на MSAA, но за разлика от палатковите филтри и EdgeAA, е изцяло хардуерно решение в РОП блоковете.
Temporal AA – този тип разчита на измама на окото, като всеки кадър използва дадено ниво на АА, но с разместени между кадрите положения на семплите. При достатъчно висока кадрова честота сливането на кадрите измамва окото, че всъщност се прилага по-високо ниво на АА. За съжаление това е и сериозния недостатък на метода – при него се изискват наистина висока производителност – примерно над 100 кадъра в секунда. Вариация на този метод се използва при SLI/CrossFire конфигурации, при което всеки графичен адаптер рендира изображението с изместени центрове на пикселите и/или местоположения на семплите и крайния резултат е комбинация от изображенията.
Regular Grid, Rotated Grid, Sparce Grid – независимо от това кой метод се използва при формирането на АА на хардуерно ниво, крайният резултат много зависи от това на кои места се вземат семплите. В по-старите графични адаптери се използва най-обикновено разположение в стила на цифрата 4 от заровете за игра, като семплите се взимат в близо до краищата на пиксела групирани успоредно на границите на екрана (regular grid). В този случай недостатъка е, че полигоните идващи под ъгъл близък до 45/135 градуса на практика не се филтрират. По-късно започна да се използва така наречената завъртяна решетка (rotated grid), при което семплите се взимат отново във формата на квадрат, но решетката им е завъртяна под някакъв ъгъл (примерно 30 градуса), в рамките на пиксела, а не е успоредна на границите на екрана. По този начин много се подобрява филтрирането на линии с наклон 45 градуса или близки до 0/90о. За съжаление остава проблема при ъгли близки до тези на градуса на завъртане на решетката, но като цяло това са относително по-редки случаи. В наши дни се използва още по-съвършено разпределени наречено „разпръсната решетка“ (sparce grid), при който семплите са разпределени още по-разпръснато в рамките на пиксела, на практика пиксела е разпределен на субпиксели (по един за семпъл), като самия семпъл се намира на различно място отместено от центъра на субпиксела. Макар и този метод да не може напълно да елиминира някои проблемни ъгли, то е много близо до тази цел.
Постпроцесинг филтри Morphological AA, Fast Approximate AA(MLAA/FXAA) – за разлика от предишните методи, тези два типа АА не разчитат на никаква информация от растерните оператори. Това са сравнително нови разработки, разчитащи в голяма степен на изключително нарасналите изчислителни възможности на графичните чипове. Те обработват крайното изображение и могат да се комбинират с останалите методи. Основната идея и при двата филтъра е една – търсене и засичане на високочестотни преходи в изображението, които би трябвало да означават границите на ръбове. След това FXAA прилага специфични субпикселни филтри, които да изгладят изображението. Предвид качеството на крайната картина, бих спекулирал че ефекта не е много по-различен от палатковите филтри, като на практика е нещо като селективен blur по засечените граници.
MLAA пък се опитва да разпознае различни стандартни алайзинг форми и да приложи предварително известен филтър за съответната форма. Предимството на FXAA е, че е реализиран като прост пикселен шейдер и може да се комбинира в един пас заедно с други постпроцесинг филтри като bloom и т.н., което позволява да работи много бързо. MLAA пък е реализиран като Compute Shader и разчита на възможностите на DX11, като теоретично самата изчислителна секция на алгоритъма би трябвало да работи по-ефективно по-този начин.
За съжаление в игрите, които не са специално предвидени да използват тези филтри могат да се получат неприятни аномалии, тъй като те ще се опитат да изгладят и евентуалният текст на елементите на интерфейса или субтитрите. Ако играта по начало е предвидена да ги използва, то тя би трябвало да съобразява това и да прилага филтрите преди да се наложат интерфейсните елементи.