Какво е филтър в игрите? Анизотропно филтриране

Тестове за ефективност:

И сега, след като се запознахме с основните концепции за филтриране и изглаждане на текстурата, можем да преминем към практиката.

Компютърна конфигурация:
Процесор: Intel Core 2 Quad Q6600 @ 3200MHz (400x8, 1.3125V)
Видео карта: Palit Nvidia GeForce 8800GT
Дънна платка: Asus P5Q PRO TURBO
Памет: 2x2048MB DDR2 Corsair XMS2 @ 1066MHz, 5-5-5-15
Захранване: Corsair CMPSU-850HXEU 850W
Охладител за процесор: Zalman CNPS9700 LED
Операционна система: Windows 7 Ultimate x64
Версия на видео драйвера: Nvidia 195.62 x64

Основният обект на нашето тестване днес беше много старата, но не по-малко известна Counter-Strike: Source, тъй като това е една от малкото наистина широко разпространени игри, които предоставят огромен набор от различни настройки за антиалиасинг и филтриране. Въпреки древността на двигателя (2004), тази игра все още може да зареди доста добре дори и най-модерната платформа. Ето такава богата гама от настройки, представени на потребителя:

Тестовете за антиалиасинг и филтриране бяха проведени във вградения бенчмарк при разделителна способност 1280x1024. Всички други настройки бяха взети като максимални, както на екранната снимка по-горе. За да се доближи резултатът възможно най-близо до истината, всеки параметър беше тестван три пъти, след което беше намерена средната аритметична стойност на получените стойности.

И така, какво получихме:

Резултатите бяха доста неочаквани. Технологията за вземане на проби от покритие (CSAA), която по дефиниция трябва да консумира по-малко ресурси от MSAA, показва напълно противоположна картина тук. Може да има много причини за това явление. На първо място, трябва да се има предвид, че в много отношения производителността при включване на anti-aliasing зависи от архитектурата на GPU. И оптимизирането на различни технологии на самата игра и версията на драйвера играят също толкова важна роля. Следователно резултатите при използване на други видеокарти или дори различна версия на драйвера може да са напълно различни.

Тестовете с деактивирано анти-алиасинг (маркирани в синьо за по-лесно възприемане) показаха приблизително еднаква картина, което показва лека разлика в натоварването на видеокартата.

В допълнение, има ясно съответствие между FPS индикаторите, когато се използва един и същ метод за антиалиасинг, за AF 8x и AF 16x. В същото време разликата варира от 1 до 4 fps (с изключение на MSAA 8x, където разликата е 11 fps). Това предполага, че използването на 16x филтриране може да бъде много полезно, ако трябва да подобрите качеството на картината без значително въздействие върху производителността.

И все пак е необходимо да се направи резервация, че е просто нереалистично да се получат същите стойности на FPS директно в играта, тъй като много сцени се оказват много по-трудни, особено с много играчи.

Тестови снимки:

И така, какво имаме? Научихме за ефектите от различните конфигурации на настройките върху производителността. "Но защо е необходимо всичко това?" - ти питаш. За да подобря качеството на показаното изображение, ще отговоря. Има ли изобщо такова увеличение? За да отговоря на този въпрос, предлагам да разгледате следните екранни снимки:

Billinear/MSAA 2xТрилинейно/MSAA 2xAF 2x / MSAA 2x
AF 2x / CSAA 8xAF 2x / MSAA 8xAF 2x / CSAA 16x
AF 2x / CSAA 16xQAF 8x/MSAA x2AF 8x / CSAA 8x
AF 8x / MSAA 8xAF 8x / CSAA 16xAF 8x / CSAA 16xQ
AF 16x / MSAA 2xAF 16x / CSAA 8xAF 16x / MSAA 8x
AF 16x / CSAA 16xAF 16x / CSAA 16xQBillinear/CSAA 16xQ

Както можете да видите, просто няма значителна разлика в комбинациите „над“ AF 8x / MSAA 8x (CSAA 8x). Но това води до забележим удар върху производителността, особено когато се използва Coverage Sampling AntiAliasing.

Изводи:

Със сигурност сред тези, които четат тази статия, ще има играчи на Cs:s, HL2 и други игри, базирани на Source двигателя. Те ще намерят тази статия за по-интересна и образователна от други. Въпреки това, целта на това писане беше само да говорим за модерни технологии, които помагат за подобряване на визуалното възприятие на игрите. А тестовете са начин да се покаже изложената теория на практика.

Разбира се, за да се гарантира надеждността на показанията, трябваше да се извършат тестове за производителност както на други видео чипове, така и на допълнителни игри.

Както и да е, връщайки се към темата на тази статия, всеки избира с какви настройки да играе. И няма да давам съвети или препоръки, тъй като те са предварително обречени на провал. Надявам се, че горната теория и тестове ще ви помогнат да се запознаете по-добре с описаните технологии.

От Stormcss


Рита злобно

С появата на 3D игри започнаха да се появяват проблеми, които не съществуват в 2D игрите: в крайна сметка сега трябва да покажете триизмерно изображение на плосък монитор. Ако обектът е успореден на равнината на екрана близо до него, няма проблеми: един пиксел съответства на един тексел (текселът е пиксел от двуизмерно изображение, насложено върху 3D повърхност). Но какво да направите, ако обектът е наклонен или е далеч? В крайна сметка тогава има няколко тексела на пиксел и тъй като мониторът има ограничен брой пиксели, цветът на всеки трябва да се изчисли от няколко тексела чрез определен процес - филтриране.


За да направим нещата по-лесни за разбиране, нека си представим, че всеки пиксел е квадратна „дупка“ в монитора, изстрелваме „лъчи светлина“ от очите, а текселите са разположени на квадратна мрежа зад монитора. Ако поставим решетката успоредно на монитора непосредствено зад него, тогава светлината от един пиксел ще покрива само един тексел. Сега ще започнем да отдалечаваме решетката - какво ще получим? Фактът, че нашето светлинно петно ​​от пиксел вече ще покрива повече от един тексел. Сега нека завъртим решетката и ще получим същото: петно ​​от един пиксел ще покрие много тексели. Но един пиксел може да има един цвят и ако има много тексели в него, тогава ни трябва алгоритъм, с който ще определим цвета му - нарича се текстурно филтриране.


Това е най-простият алгоритъм за филтриране: той се основава на факта, че за цвета на пиксела вземаме цвета на тексела, който е най-близо до центъра на светлинното петно ​​от пиксела. Предимството на този метод е очевидно - той натоварва най-малко видеокартата. Има и много недостатъци - цветът на един централен тексел може да се различава значително от цвета на десетки и дори стотици други тексели, които попадат в пикселното петно. Освен това формата на самото петно ​​може да се промени значително, но центърът му може да остане на същото място и в резултат на това цветът на пиксела няма да се промени. Е, основният недостатък е проблемът с „блоковостта“: когато има малко тексели на пиксел (т.е. обект до плейъра), тогава получаваме, че с този метод на филтриране доста голяма част от изображението е запълнена с един цвят, което води до ясно видими "блокове" от един и същи цвят на екрана. Крайното качество на картината е... просто ужасно:


Така че не е изненадващо, че такова филтриране вече не се използва днес.


С развитието на видеокартите тяхната мощност започна да се увеличава, така че разработчиците на игри отидоха по-далеч: ако вземете един тексел за цвят на пиксел, това се оказва лошо. Добре – нека вземем средния цвят от 4 тексела и да го наречем билинейно филтриране? От една страна, всичко ще се подобри - блокирането ще изчезне. Но враг номер две ще дойде - размазването на изображението в близост до играча: това се дължи на факта, че интерполацията изисква повече тексели от четири.

Но това не е основният проблем: билинейното филтриране работи добре, когато обектът е успореден на екрана: тогава винаги можете да изберете 4 тексела и да получите „среден“ цвят. Но 99% от текстурите са наклонени към играча и се оказва, че апроксимираме 4 правоъгълни паралелепипеда (или трапеца) като 4 квадрата, което е неправилно. И колкото повече е наклонена текстурата, толкова по-ниска е точността на цветовете и толкова по-силно е размазването:


Добре, разработчиците на играта казаха - тъй като 4 тексела не са достатъчни, нека вземем два пъти по четири и за по-точно съответствие на цвета ще използваме технологията за mip-текстуриране. Както вече писах по-горе, колкото по-далеч е текстурата от плейъра, толкова повече тексели ще има в един пиксел и толкова по-трудно е за видеокартата да обработи изображението. MIP текстурирането означава съхраняване на една и съща текстура в различни разделителни способности: например, ако оригиналният размер на текстурата е 256x256, тогава нейните копия се съхраняват в паметта в 128x128, 64x64 и т.н., до 1x1:


И сега, за филтриране, се взема не само самата текстура, но и mipmap: в зависимост от това дали текстурата е по-далеч или по-близо от играча, се взема по-малка или по-голяма mipmap на текстура и вече върху нея 4-те най-близки тексела до центъра на пиксела и се извършва билинеен анализ, филтриране. След това се вземат 4 тексела, най-близки до пиксела на оригиналната текстура, и отново се получава „средният“ цвят. След това „средният“ цвят се взема от средните цветове на mipmap и оригиналната текстура и се присвоява на пиксела - така работи алгоритъмът за трилинейно филтриране. В резултат на това натоварва видеокартата малко повече от билинейното филтриране (mipmap също трябва да се обработи), но качеството на изображението е по-добро:


Както можете да видите, трилинейното филтриране е сериозно по-добро от билинейното и още повече точковото филтриране, но изображението все още се размазва на големи разстояния. А размитата картина се дължи на факта, че не отчитаме факта, че текстурата може да бъде наклонена спрямо играча - и точно това е проблемът, който анизотропното филтриране решава. Накратко, принципът на действие на анизотропното филтриране е следният: взема се MIP текстура, зададена в посоката на гледане, след което нейните цветови стойности се осредняват с цвета на определен брой тексели по посока на гледане. Броят на текселите варира от 16 (за x2 филтриране) до 128 (за x16). Казано по-просто, вместо квадратен филтър (както при билинейното филтриране) се използва удължен, който ви позволява по-добре да изберете желания цвят за екранен пиксел. Тъй като на екрана може да има милион или дори повече пиксела и всеки тексел тежи поне 32 бита (32-битов цвят), анизотропното филтриране изисква огромна честотна лента на видео паметта - десетки гигабайта в секунда. Такива големи изисквания към паметта са намалени поради компресиране на текстури и кеширане, но все пак на видеокарти с DDR памет или 64-битова шина разликата между трилинейното и x16 анизотропното филтриране може да достигне 10-15% fps, но картината след такова филтриране се оказва най-добрият:

Текстурно филтриране.

Филтрирането решава проблема с определянето на цвета на пиксел въз основа на съществуващи тексел от изображение на текстура.

Най-простият метод за прилагане на текстури се нарича точково вземане на проби(вземане на проби от една точка). Същността му е, че за всеки пиксел, съставляващ многоъгълника, се избира един тексел от изображението на текстурата, който е най-близо до центъра на светлинното петно. Възниква грешка, защото цветът на един пиксел се определя от няколко тексела, но е избран само един.

Този метод е много неточен и резултатът от използването му е появата на неравности. А именно, когато пикселите са с по-голям размер от текселите, се наблюдава ефект на трептене. Този ефект възниква, ако част от многоъгълника е достатъчно далеч от точката на наблюдение, че много тексели да се наслагват върху пространството, заемано от един пиксел. Имайте предвид, че ако многоъгълникът е разположен много близо до точката на наблюдение и текселите са с по-голям размер от пикселите, се наблюдава друг тип влошаване на качеството на изображението. В този случай изображението започва да изглежда на блокове. Този ефект възниква, когато текстурата може да е достатъчно голяма, но ограничението в наличната разделителна способност на екрана пречи на оригиналното изображение да бъде правилно представено.

Втори метод - билинейно филтриране(Двулинейно филтриране) се състои от използване на технология за интерполация. За определяне на текселите, които трябва да се използват за интерполация, се използва основната форма на светлинното петно ​​- кръг. По същество кръгът се апроксимира с 4 тексела. Билинейното филтриране е техника за елиминиране на изкривяванията на изображението (филтриране), като например "блоковост" на текстурите, когато са уголемени. При бавно въртене или преместване на обект (приближаване/отдалечаване) може да се забележи „скачане“ на пиксели от едно място на друго, т.е. се появява блокада. За да се избегне този ефект, се използва билинейно филтриране, което използва среднопретеглена стойност на цветовата стойност на четири съседни тексела, за да определи цвета на всеки пиксел и в резултат на това определя цвета на текстурата на наслагването. Полученият цвят на пиксела се определя след извършване на три операции на смесване: първо се смесват цветовете на две двойки тексели и след това двата получени цвята се смесват.

Основният недостатък на билинейното филтриране е, че апроксимацията се извършва правилно само за полигони, които са разположени успоредно на екрана или точката на наблюдение. Ако многоъгълникът се завърти под ъгъл (а това е в 99% от случаите), се използва грешно приближение, тъй като трябва да се приближи елипса.

Грешките при „изравняване на дълбочината“ възникват от факта, че обектите, които са по-далеч от гледната точка, изглеждат по-малки на екрана. Ако даден обект се движи и се отдалечава от точката на гледане, изображението на текстурата, насложено върху свиващия се обект, става все по-компресирано. В крайна сметка изображението на текстурата, приложено към обекта, става толкова компресирано, че възникват грешки при изобразяването. Тези грешки при рендиране са особено проблематични при анимация, където такива артефакти на движение причиняват трептене и ефекти на забавен каданс в части от изображението, които трябва да са неподвижни и стабилни.

Следните правоъгълници с билинейно текстуриране могат да служат като илюстрация на описания ефект:

Ориз. 13.29. Засенчване на обект чрез метода на билинеарно филтриране.Появата на артефакти на "дълбочината на псевдонима", което води до сливане на няколко квадрата в едно.

За да избегнете грешки и да симулирате факта, че обектите на разстояние изглеждат по-малко детайлни от тези, които са по-близо до зрителната точка, техника, известна като mip-картографиране. Накратко, mip-mapping е наслагване на текстури с различни степени или нива на детайлност, когато в зависимост от разстоянието до точката на наблюдение се избира текстура с необходимата детайлност.

Mip-текстура (mip-карта) се състои от набор от предварително филтрирани и мащабирани изображения. В изображение, свързано със слой mip-map, един пиксел е представен като средна стойност от четири пиксела от предишния слой при по-висока разделителна способност. Следователно изображението, свързано с всяко ниво на mip-текстура, е четири пъти по-малко по размер от предишното ниво на mip-map.

Ориз. 13.30 ч. Изображения, свързани с всяко ниво на mip-map на вълнообразната текстура.

Отляво надясно имаме mip-map нива 0, 1, 2 и т.н. Колкото по-малко става изображението, толкова повече детайли се губят, до почти края, когато не се вижда нищо освен замъглено петно ​​от сиви пиксели.

Нивото на детайлност или просто LOD се използва за определяне кое ниво на mip-map (или ниво на детайлност) трябва да бъде избрано, за да се приложи текстура към обект. LOD трябва да съответства на броя на текселите, насложени на пиксел. Например, ако се получи текстуриране със съотношение, близко до 1:1, тогава LOD ще бъде 0, което означава, че ще се използва нивото на mip-map с най-висока резолюция. Ако 4 тексела припокриват един пиксел, тогава LOD ще бъде 1 и ще се използва следващото mip ниво с по-ниска разделителна способност. Обикновено, докато се отдалечавате от точката на наблюдение, обектът, който заслужава най-голямо внимание, има по-висока LOD стойност.

Въпреки че mip-текстурирането решава проблема с грешките в псевдонима на дълбочината, използването му може да доведе до появата на други артефакти. Тъй като обектът се движи все повече и повече от точката на наблюдение, се получава преход от ниско ниво на mip-map към високо. Когато даден обект е в преходно състояние от едно ниво на mip-map към друго, се появява специален тип визуализационна грешка, известна като “mip-banding” - ленти или ламиниране, т.е. ясно видими граници на преход от едно ниво на mip-map към друго.

Ориз. 13.31 ч. Правоъгълната лента се състои от два триъгълника, текстурирани с вълнообразно изображение, където артефактите "mip-banding" са обозначени с червени стрелки.

Проблемът с грешките на "mip-banding" е особено остър в анимацията, поради факта, че човешкото око е много чувствително към измествания и лесно може да забележи мястото на рязък преход между нивата на филтриране, когато се движи около обект.

Трилинейно филтриране(трилинейно филтриране) е трети метод, който премахва артефактите на mip-ленти, които възникват, когато се използва mip-текстуриране. При трилинейно филтриране, за да се определи цвета на пиксел, се взема средната цветова стойност от осем тексела, вземат се четири от две съседни текстури и в резултат на седем операции на смесване се определя цветът на пиксела. Когато се използва трилинейно филтриране, е възможно да се покаже текстуриран обект с плавни преходи от едно mip ниво към следващото, което се постига чрез определяне на LOD чрез интерполиране на две съседни mip-map нива. По този начин се решават повечето от проблемите, свързани с mip-текстурирането и грешките, дължащи се на неправилно изчисляване на дълбочината на сцената ("depth aliasing").

Ориз. 13.32. Pyramid MIP-карта

По-долу е даден пример за използване на трилинейно филтриране. Тук отново се използва същият правоъгълник, текстуриран с вълнообразно изображение, но с плавни преходи от едно mip ниво към следващото поради използването на трилинейно филтриране. Имайте предвид, че няма забележими грешки при изобразяването.

Ориз. 13.33. Правоъгълник, текстуриран с вълнообразно изображение, се изобразява на екрана с помощта на mip-текстуриране и трилинейно филтриране.

Има няколко начина за генериране на MIP текстури. Един от начините е просто да ги подготвите предварително с помощта на графични пакети като Adobe PhotoShop. Друг начин е да генерирате MIP текстури в движение, т.е. по време на изпълнение на програмата. Предварително подготвените MIP текстури означават допълнителни 30% дисково пространство за текстури в основната инсталация на играта, но позволяват по-гъвкави методи за контролиране на тяхното създаване и ви позволяват да добавяте различни ефекти и допълнителни детайли към различни MIP нива.

Оказва се, че трилинейното mipmapping е най-доброто, което може да бъде?

Разбира се, че не. Вижда се, че проблемът не е само в съотношението на размерите на пикселите и текселите, но и във формата на всеки от тях (или по-точно в съотношението на формите).

Методът на mip-текстуриране работи най-добре за полигони, които са директно лице в лице с гледната точка. Многоъгълниците, които са наклонени по отношение на точката на наблюдение обаче, огъват насложената текстура, така че различни типове и квадратни области на изображението на текстурата да могат да бъдат насложени върху пикселите. Методът за текстуриране на mip не взема това предвид и резултатът е, че изображението на текстурата е твърде размазано, сякаш са използвани грешни тексел. За да разрешите този проблем, трябва да вземете проби от повече от текселите, които изграждат текстурата, и трябва да изберете тези тексели, като вземете предвид „картографираната“ форма на пиксела в текстурното пространство. Този метод се нарича анизотропно филтриране(„анизотропно филтриране“). Конвенционалното mip текстуриране се нарича „изотропно“ (изотропно или равномерно), защото винаги филтрираме заедно квадратни региони от текселите. Анизотропното филтриране означава, че формата на текселната област, която използваме, се променя в зависимост от обстоятелствата.

Описание на алгоритмите за текстуриране: филтриране на текстури

Текстурно филтриране

Напоследък компаниите, занимаващи се с разработването на 3D компютърна графика, непрекъснато се стремят да увеличат детайлите и качеството на изображението при компютърно изобразяване. Постоянно се разработват нови технологии и архитектури за 3D изобразяване, алгоритмите за компресиране се подобряват и надграждат, за да се увеличи честотната лента на паметта, а архитектурата на паметта също претърпява промени. За съжаление, разликата между напредналите идеи в 3D графиката и конвенционалните компютри е доста голяма: реализъм в съвременните игри и т.н. направени по технологии, разработени преди 1-2 години. В допълнение, мощността на обикновените компютри е много ограничена, поради което се използват доста прости алгоритми за игри, които ще обсъдим в тази статия: това е текстуриране и по-подробно - филтриране на текстури.

Разполагайки с идеален компютър с производителност, много по-добра от сегашната, ще можем да покажем картина в реално време с много реалистично изобразяване. Би било възможно да се изчислят милиони, дори милиарди пиксели и да се зададе собствен цвят за всеки от тях - в този случай картината просто не може да се различи от истинско видео. Но за съжаление засега това са само мечти: за съществуващите компютри все още е твърде трудно да обработват едновременно рисуването на обекти при движение и т.н. Освен това все още има катастрофална липса на честотна лента на паметта. За да се осигури добро качество в 3D приложенията, се разработват технологии за опростяване на процеса на рендиране на изображения.

Една от най-използваните технологии, които опростяват изчисленията на изображения с доста добро качество, е текстурирането. Текстурата е 2D изображение, приложено към 3D обект или всяка повърхност. Нека вземем следната ситуация като пример: вие сте разработчик и искате потребителят да види тухлена стена. Създава се 3D рамка за стена и можете да изберете тухлите отделно. Сега правим 2D снимка на тухла и я поставяме върху тухла в 3D рамка и така нататък - цялата стена. Резултатът е нормална 3D стена, като графичният чип няма нужда да чертае и изчислява всеки пиксел – той изчислява координатите на 3D рамката, към която е прикрепено 2D изображението.

Има още една концепция в текстурирането, която трябва да бъде обсъдена. Когато наслагвате 2D изображение, то се разделя на множество цветни фрагменти. Това се прави, за да мащабирате обекта - текстурата е двуизмерна, а триизмерният обект трябва да се променя при приближаване или отдалечаване. Текстурата също трябва да се промени, за да се запази реализъм и качество. И така, текстурата е разделена на много цветни фрагменти, които се наричат ​​тексел (текстурни елементи). В бъдеще, например, когато се приближавате до обект, няма нужда да презареждате нова текстура: текселите се вземат от оригиналната текстура и се увеличават. Разбира се, качеството се губи, но остава на доста високо ниво, освен това с този подход графичният процесор и паметта са значително разтоварени.

Mip-Mapping

Движението е характеристика на всички показани обекти; Дори ако самият обект е неподвижен, той все още се променя, когато зрителният ъгъл на героя се промени поради неговото движение. Следователно текстурата, поставена върху обекта, също трябва да се движи - това води до някои усложнения и допълнителна обработка. Но какво ще стане, ако погледнем обект от някакъв ъгъл, например от пода? Подът може да заема голяма площ и за да се поддържа реализъм, колкото по-далеч е от нас, толкова по-малки са неговите компоненти (например плочки). За да се гарантира това, текстурата трябва да бъде намалена по определен начин. За съжаление, простата промяна на разделителната способност на текстурите може да доведе до доста неприятен ефект, когато една текстура визуално се слива с друга. Друг неприятен ефект може да възникне, ако текселът е по-голям от необходимия брой пиксели. Това се случва, когато гледате текстура, която е много далеч. И двете ситуации възникват при използване на традиционно анти-алиасинг. И ето реални примери за тези случаи: няма

За смекчаване на подобни ситуации беше създадено mip-mapping. Тази технология работи много просто: оригиналната текстура се генерира в различни ситуации по такъв начин, че да показва правилно текстурата на различни разстояния и при различни ъгли на гледане. При приближаване към обект текстурата се показва с по-висока резолюция, а при отдалечаване - с по-ниска. По този начин mip-mapping подобрява качеството на изображението и намалява неравностите. По-долу са същите снимки, само с активирано mip-mapping: в това резюме няма снимки.

Забелязахте ли подобрение в качеството? Особено забележимо е на втората снимка с жълто-червената шарка. Моля, обърнете внимание: качеството не само на отдалечените текстури се е подобрило: близките също изглеждат много по-добре. Като цяло, изображение с mip-mapping изглежда много по-добре, отколкото без него: няма многобройни изкривявания и изкривявания, забележими при нормално показване.

Филтриране

Точковото текстуриране е може би основният тип текстуриране. При точковото текстуриране се избира отделен фрагмент от текстурата (тексел) и се използва като цветова стойност за пикселите. Факт е, че този метод води до известна небрежност и, като следствие, влошаване на качеството на изображението. Такова изображение е просто неприемливо според съществуващите стандарти. По-долу има текстура, която е обработена с точково текстуриране (долната част на снимката). Картината показва теоретичното влошаване на качеството при избор на размер на тексел, който е твърде голям.

Bilineat Филтриране

Друг метод за текстуриране е билинейното филтриране. Принципът на действие на този метод на текстуриране е много подобен на точковия метод, но за разлика от него, за избор на цвета на пикселите се използва не пълното изображение, а блок от 4 тексела. Това подобрява точността при избора на цветове на пикселите и постига по-добро изобразяване на отделни малки детайли в изображението.

Тази снимка показва пример за изчертаване на изображение с помощта на билинейно филтриране и mip-mapping.

Трилинейно филтриране

Билинейното филтриране получи второто си раждане под формата на трилинейно филтриране, чийто принцип на работа е абсолютно същият, но се използва подобрен алгоритъм за изчисление, което повишава точността на изобразяване. Трилинейното филтриране, подобно на билинейното филтриране, използва блокове от 4 тексела, точно както при билинейното филтриране, изображението се нормализира, след което изображението от граничния блок от 4 тексела се нормализира. Последната стъпка е да се анализира границата на двата блока, в резултат на което се коригират евентуални грешки и несъответствия на границата на тези 2 блока. При билинейното филтриране е доста обичайно да се виждат линии, появяващи се на границите на блока, които изчезват при използване на трилинейно филтриране. Освен това, когато използвате трилинейно филтриране, изкривяванията и нередностите по време на движение и при промяна на ъгъла на гледане се отстраняват по-добре. По-долу има диаграма за това как се използва трилинейното филтриране и в действие.

Трябва да се отбележи, че някои дефекти се появяват на значително разстояние дори при използване на трилинейно филтриране. Това е така, защото първоначално е проектиран да намали изкривяването между нивата на mip-map.

Изображението се получава с много високо качество само при по-директни ъгли на гледане, при реално рисуване е възможно да се нарушат геометричните форми на обекта. Вижте снимката от SGI:

Анизотропно филтриране

Формата на текстурирани обекти, както по време на билинейно, така и по време на трилинейно филтриране, може да бъде изкривена, т.к. И двата филтъра са изотропни - изображението се филтрира в определена форма - във формата на квадрат. Повечето от генерираните обекти не отговарят на тази специфична и непроменена форма: за тяхната качествена обработка е необходимо да се използва друг вид филтриране - анизотропно. Анизотропията се състои от няколко думи на латински и буквално означава "Ani" - не, "iso" - определена форма и "tropia" - модел - т.е. модели с неопределена форма. Името на тази технология отразява нейното техническо изпълнение. Анизотропното филтриране обикновено работи върху поне 8 тексела, нива на mip-map във всички посоки и използва модел с предварително определена форма. В резултат на това шумът и изкривяването на обектите се премахват, а изображението като цяло е с по-високо качество.

Сравнете две снимки: едната използва 16-текселово анизотропно филтриране, което елиминира изкривяванията между нивата на mip-map и шума в изображението; втората снимка е с изключено анизотропно филтриране.

Обърнете внимание на големите разстояния на изображението: разликите между анизотропното и изотропното филтриране са очевидни. Качеството на текстурата с анизотропно филтриране остава подобно на оригиналното дори на големи разстояния; При изотропното филтриране има тенденция за „изглаждане“ на изображението, което води до загуба на качество. Анизотропното филтриране, подобно на трилинейното филтриране, намалява неравностите на текстурата. Но когато се използва анизотропно филтриране, качеството все още е по-добро, т.к той използва много по-голям брой блокове за сравнение. Ето друг пример, показващ анизотропно филтриране в действие:

Дълго време графичните карти от потребителски клас не осигуряваха качеството на изображението, което е възможно с анизотропно филтриране. С появата на графични чипове като NVIDIA GeForce2 и ATI Radeon стана възможно използването на анизотропно филтриране, което анализира блокове от 16 тексела в хардуера. Видеокартите GeForce3 и Radeon 8500 вече използват анизотропно филтриране с 32 тексела. Картината по-долу показва изображение, близко до това, което би се получило с помощта на професионално 64 текселно анизотропно филтриране:

Бъдеще...

В близко бъдеще анизотропното филтриране ще се използва все по-често. За следващото поколение графични чипове вече се разработват нови технологии за елиминиране на неравности и ъгли на обекти. В близко бъдеще ще видим изображения, обработени с помощта на мултитекселни блокове. Ще има видео карти, способни на хардуерна поддръжка за анизотропно филтриране, използвайки 128 текселни блока. В същото време качеството на изображението ще се подобри значително и производителността ще се увеличи.

Допълнително:

Antialiasing и анизотропно филтриране днес: какво, къде и колко? Част първа

Всъщност, статия с такова заглавие може да започне с някаква баналност като „всеки потребител на компютър в даден момент е виждал работата на техники за подобряване на 3D изображения, като анти-алиасинг или анизотропно филтриране“. Или това: „докато нашите космически кораби обикалят космоса, програмистите на NVIDIA и ATI търсят начини да подобрят производителността на добре познатите техники за подобряване на изображението.“ Втората баналност има много по-голям шанс да живее в смисъл, че вече интригува с някакво подобие на факта, че ще изследваме въпроса кой и как е „оптимизирал“ драйверите си.

Вероятно обаче изобщо ще минем без баналности. Защото е много по-интересно да се спекулира колко достъпни са станали техниките за подобряване на изображението за обикновения потребител или, по-правилно, за обикновения геймър. Геймърите днес са най-активните потребители на всички нови технологии и иновации в 3D. Като цяло мощен 3D ускорител днес е необходим изключително за игра на най-новите компютърни игри с мощни 3D двигатели, които работят със сложни шейдъри от различни версии. В днешно време няма да изненадате никого с игра с пикселни шейдъри версия 2.0 - в света на игрите подобно забавление бавно се превръща в ежедневие. Повечето игри все още се пускат с помощта на шейдър модел 1.1 поради факта, че най-важното нещо за разработчиците на игри е да гарантират, че играта им работи сравнително добре на хардуера, който имат по-голямата част от играчите. Създаването на супер сложен двигател сега е голяма загуба и дори риск. Преценете сами: разработването на двигател от класа „Doom 3“ или „Half-Life 2“ (е, нека добавим тук пионера на шейдърите 2.0 в цялата му слава, рожбата на Crytek – „FarCry“, за да получите истинска вездесъща троица) отнема огромно количество време, което създава допълнителни трудности при разработването - необходимо е да се разработи двигателят в такава времева рамка, че иновациите и оригиналните разработки да не остареят по време на създаването на двигателя.

Ако се съмнявате, че това може да се случи, тогава е напълно напразно - в случая с "Half-Life 2" всичко беше точно така (а "Doom 3" беше разработен с оглед на GeForce 3 и беше пуснат, когато GeForce FX). Освен това разработването на двигатели от този клас е свързано с високи разходи за разработка: днес талантливите програмисти не са евтини. И напоследък много внимание (дори повече от необходимото) се обръща на, така да се каже, „политика“ по отношение на игровите двигатели.

Да, да, точно така, правилно чухте, 3D областта отдавна има своя собствена политика, основана, естествено, на интересите на двата гиганта в дизайна на графични процесори: ATI и NVIDIA. Суровата Канада отдавна се бори срещу слънчева Калифорния и досега не се вижда краят на тази конфронтация, която, разбира се, е от полза само за нас, обикновените потребители. Сега не е достатъчно да разработите готин двигател - за да успеете, трябва да привлечете подкрепата на калифорнийската дива NVIDIA или канадската ATI, за щастие, сега и първата, и втората имат свои собствени програми за партньорство за разработчиците на игри. NVIDIA нарича такава програма „Начинът, по който трябва да се играе“, а ATI я нарича „Вкарайте я в играта“. Всичко е доста красноречиво и ясно: NVIDIA казва, че „трябва да играете така“, а не Изобщо така, а ATI уверява, че със сигурност ще получим всичко, което искаме в самата игра. Доста изкушаващо, нали? Двигателите са от класа “Doom 3” и “Half-Life 2” (в случая на последния, двигателят се нарича Source, но за по-лесно разбиране ще го наречем „Half-Life 2“, за да поддържаме правилната връзка) и първоначално са разработени в тясно сътрудничество с инженери от производителите на графични чипове, така че игрите ще работи по-добре на GPU на един производител.

Следователно, както виждаме, революциите в областта на новите 3D графични двигатели са много проблематични и следователно тези революции в света на игралните двигатели не се случват много често. Качеството на изображението обаче трябва да се подобри по някакъв начин. Ако просто увеличим броя на полигоните в рамката, като по този начин получим визуално по-красива картина за възприемане, тогава в крайна сметка ще стигнем до точката, че ускорителят няма да може да обработи сцената с приемливо ниво на кадрова честота , но пак ще липсва нещо на снимката. Стълбите от пиксели все още ще останат и качеството на текстурите няма да се подобри. Има по-малко очевидни начини за подобряване на качеството на триизмерно изображение на монитор - анизотропно филтриране и антиалиасинг. Тези техники за подобряване на изображението нямат нищо общо директно със самия 3D двигател и, естествено, не могат да направят самия двигател по-красив, но могат да работят с текстури и изображения по такъв начин, че на изхода, т.е. монитор, можем да видим визуално по-красива и по-мека картина.

Именно в областта на анизотропното филтриране и антиалиасинг се извършва колосално количество оптимизация на драйверите както от страна на NVIDIA, така и от ATI. Компаниите имат различни подходи и политики по отношение на същите тези оптимизации, понякога не съвсем справедливи към потребителите. Нашата статия обаче има за цел да разбере какво е добро и какво е лошо в подходите на двете компании за производство на GPU и какво може да подобри качеството на изображението в 3D игрите днес.

Какво е антиалиасинг и за какво се използва?

Преди да започнем да навлизаме в подробности по отношение на такава гореща тема като оптимизиране на антиалиасинг и различни видове филтриране на текстури, няма да навреди (и дори да кажем, че е необходимо) да придобием някои теоретични знания по темата на нашия разговор днес.

И така, антиалиасинг - какво е това и защо е необходимо? На първо място, в думата "антиалиасинг" е необходимо да се подчертае частта от нея - "анти". Съвсем ясно е, че тази част от думата предполага, че самият феномен на „антиалиасинг“ е насочен към борба с нещо. Както се досещате, в нашия случай – с „алиасинг“. Ето защо в този момент за нас е важно ясно да разберем какво представлява прословутото „псевдоним“.

Първо, трябва ясно да разберете, че изображението, което вие и аз можем да виждаме всеки ден на екраните на нашите монитори, се състои от така наречените малки частици, които обикновено се наричат ​​пиксели. Добра аналогия в този смисъл е примерът с карирана хартия. Изображението на монитора е същата карирана хартия, само че в този случай те са много, много малки. Ако казват, че разделителната способност на екрана е 1024x768 с 32-битов цвят, това означава, че хоризонтално на монитора се побират 1024 пиксела, а вертикално 768. Освен това всеки пиксел може да бъде боядисан с един цвят от наличните в 32-битовата палитра. В момента 32-битовият цвят е границата на това, което можем да постигнем на компютърен екран. Най-добрите умове на човечеството (същият Кармак) вече говорят за необходимостта от преминаване към 64-битов цвят и посочват очевидните недостатъци на 32-битовата палитра. Едно време, когато се преминаваше от 16-битов към 32-битов цвят, тази необходимост беше съвсем ясно оправдана и имаше реални причини, поради които си струва да се премине към 32 бита. Преходът към 64-битов цвят днес е доста пресилен. Точно както в случая с 16 и 32 бита, след време ще трябва да изчакате доста дълго време, докато ускорителите от всички нива ще могат да обработват 64-битов цвят с приемлива скорост.

По-голямата част от статиите, които по един или друг начин засягат принципите на конструиране на изображения в 3D и където се говори за антиалиасинг, са пълни с прост, но в същото време най-ефективен пример, който може да се използва за разбиране доста добре какво е антиалиасинг. Вижте увеличения надпис „Upgrade“, направен в Word и след това просто увеличен във Photoshop. Не изглежда много добре, нали? Отстрани на буквите можете да видите така наречения гребен или, както се нарича още, „стълба“. По същество този „гребен“ или „стълба“ е псевдоним. Друг пример може да бъде представен от геометричен обект, като пирамида. Същият „гребен“ също се вижда ясно по краищата му. Сега погледнете друго изображение на същата пирамида, но с двойно по-голяма резолюция. Вече изглежда много по-добре, а „гребенът“ почти не се забелязва. Както бе споменато по-горе, този ефект, изглаждане на „гребена“, беше постигнат поради факта, че увеличихме разделителната способност 2 пъти.

Какво означава това? Да приемем, че сме рендирали пирамида с резолюция 200х200 пиксела (по-горе вече изяснихме подробно въпроса какво представляват пикселите и защо са необходими). Увеличихме броя на точките вертикално и хоризонтално точно 2 пъти, тоест получихме изображение с резолюция 400 пиксела вертикално и 400 пиксела хоризонтално. Това също означава, че броят на точките върху нашия обект, който е бил в сцената, се е удвоил. Какво направи това за нашия ефект на псевдоним? Очевидно той е станал минимален, тоест изгладен - в крайна сметка броят на точките по краищата на обекта също се е удвоил. Ключовата тук е думата „изгладен“. В края на краищата антиалиасингът иначе се нарича антиалиасинг, което отразява самата същност на технологията, която изглажда тази „стълба“ по краищата на триизмерните обекти.

Всъщност, след увеличаване на разделителната способност, „стълбата“ от ръба на пирамидата не е изчезнала - тя остава там, както преди. Въпреки това, поради факта, че увеличихме разделителната способност (което означава увеличение на пикселите, изразходвани за показване на пирамидата), ефектът на „стълбата“ беше изгладен поради особеностите на човешкото зрение, което вече не вижда ясно пикселите на ръба на обект. Абсолютно ясно е, че ако увеличавате разделителната способност все повече и повече, ефектът на псевдонима ще се наблюдава във все по-малка степен. По-точно, човешкото око ще започне да го забелязва във все по-малка степен, тъй като самият ефект на псевдонима няма да изчезне. Но също така е абсолютно ясно, че няма да е възможно да се увеличава безкрайно разделителната способност, тъй като мониторите, дори и най-модерните, имат крайни разделителни способности и не толкова големи, което няма да ни позволи постоянно да увеличаваме броя на точките. Просто казано, най-простият антиалиасинг ефект може да се постигне чрез просто увеличаване на разделителната способност на екрана, но резолюцията не може да се увеличава безкрайно. Изглежда, че няма изход? В действителност обаче беше намерено и се основава на същата характеристика на човешкото зрение.

Това беше постигнато благодарение на плавните преходи на цветовете в изображението. Всъщност визуалното подобрение на изображението се извършва не поради физическо увеличаване на разделителната способност, а поради, така да се каже, цветово увеличение на разделителната способност. В тази статия няма да описваме алгоритми за изчисляване на тези точки и няма да навлизаме в дълбините на математическите изчисления, а само ще говорим за принципа на работа на такова антиалиасинг. Стълбата на границите на обектите се вижда само защото най-често краищата на триизмерните обекти се открояват доста силно като цвят от останалата част от картината и изглеждат като тънки линии от един пиксел. Това може да се компенсира чрез поставяне на няколко точки с цветове, изчислени от цветовите стойности на самия ръб и точките близо до този ръб. Тоест, ако ръбът на обект е черен, а фонът е бял, тогава допълнителната точка до линията на черния ръб ще стане сива. Колкото повече от тези допълнителни точки са близо до ръба на всеки 3D обект, толкова по-гладки ще изглеждат ръбовете му и толкова по-малко забележима ще бъде стълбата. Този метод се нарича антиалиасинг на ръба. Качеството на антиалиасинг, зададено в драйвера на видеокартата, като: 2x, 4x, 6x, 8x означава броя на допълнителните пиксели, поставени около линията, която се нуждае от антиалиасинг.

Анизотропно филтриране: мини образователна програма за начинаещи

За да разберете какво е филтриране, трябва да имате някои основни познания. Вече разбрахме, че изображението на екрана се състои от много пиксели, чийто брой се определя от разделителната способност. За да изведе цветно изображение, вашата графична карта трябва да открие цвета на всеки пиксел. Цветът му се определя чрез наслагване на текстурни изображения върху полигони, които са разположени в триизмерно пространство. Текстурните изображения се състоят от пиксели или по-скоро тексели, т.е. текселът е пиксел от двуизмерно изображение, насложено върху 3D повърхност. Основната дилема е следната: кой тексел или тексел определя цвета на пиксел на екрана. За да си представим проблема с филтрирането, нека си представим една картина. Да приемем, че вашият екран е плоча с много кръгли дупки, всяка от които е пиксел. За да определите какъв цвят има даден пиксел спрямо триизмерната сцена, разположена зад плочата, просто трябва да погледнете през една от дупките.

Сега си представете лъч светлина, който преминава през една от дупките и удря нашия текстуриран многоъгълник. Ако последният е разположен успоредно на отвора, през който преминава светлинният лъч, тогава светлинното петно ​​ще има формата на кръг. В противен случай, ако многоъгълникът не е успореден на отвора, светлинното петно ​​се изкривява и има елипсовидна форма. Смятаме, че много читатели в този момент задават един въпрос: „как всички тези плочи, дупка, лъч светлина са свързани с проблема за определяне на цвета на пиксел?“ внимание! Ключова фраза: всички полигони, разположени в светлинното петно, определят цвета на пиксела. Всичко по-горе е необходимото основно знание, което е необходимо, за да се разберат различни алгоритми за филтриране.

И сега, за да разберете по-добре защо е необходимо филтриране, нека да разгледаме протичащите процеси, използвайки примера на легендарната „Quake 3 Arena“. Представете си някакъв коридор с много квадрати и различни орнаменти (за щастие, Quake 3 Arena има достатъчно от това). Орнаментът в началото на коридора е силно детайлизиран, а по-близо до края на коридора (хоризонта) елементите на орнамента стават все по-малки, т.е. те се показват с по-малко пиксели. В резултат на това се губят детайли като шевове между елементите на орнамента, което съответно води до влошаване на качеството на изображението.

Проблемът е, че драйверът на графичната карта не знае кои детайли в текстурата са важни.

Точково вземане на проби

Точковото вземане на проби е най-простият начин за определяне на цвета на пиксел. Този алгоритъм се основава на изображение на текстура: избира се само един тексел, който е най-близо до центъра на светлинното петно, и цветът на пиксела се определя от него. Не е трудно да се досетите, че това е напълно погрешно. Първо, цветът на един пиксел се определя от няколко тексела, а ние избрахме само един. Второ, формата на светлинното петно ​​може да се промени и алгоритъмът не взема това предвид. Но напразно!

Основният недостатък на инлайн семплирането е фактът, че когато многоъгълникът е разположен близо до екрана, броят на пикселите ще бъде значително по-голям от текселите, поради което качеството на изображението ще пострада значително. Така нареченият блокиращ ефект, както вярваме, мнозина биха могли да наблюдават в стари компютърни игри, например в същата легендарна „Doom“.

Точковото вземане на проби има предимство. Поради факта, че определянето на цвета на пиксела се извършва с помощта само на един тексел, този метод не е критичен за честотната лента на паметта и това автоматично дава на този метод на филтриране огромни предимства в смисъл, че много малко ресурси на 3D ускорителя се изразходват за филтриране по тази схема.

Би-линейно филтриране

Bi-Linear Filtering – билинейно филтриране, базирано на метода на използване на интерполационна технология. За да се определят необходимите тексели, се използва основната форма на светлинното петно, тоест кръг. В нашия пример с кръг последният се апроксимира с 4 тексела. Както можете да видите, тук нещата са малко по-добри, отколкото при Point Sampling. Билинейното филтриране вече използва 4 тексела.

Изображението е с по-високо качество, няма блокировки, но полигоните близо до екрана изглеждат замъглени и това се дължи на факта, че интерполацията изисква по-голям брой тексели от наличните четири.

Неяснотата в никакъв случай не е основният проблем на билинейното филтриране. Факт е, че апроксимацията се извършва правилно само за обекти, разположени успоредно на екрана или точката на наблюдение, докато 99% от обектите във всяка компютърна игра са разположени неуспоредно на точката на наблюдение. От това можем да заключим, че 99% от обектите ще бъдат апроксимирани неправилно. Да вземем например нашата окръжност - многоъгълникът е разположен непаралелно спрямо точката на наблюдение, следователно трябва да апроксимираме елипса, но апроксимираме окръжност, което е крайно неправилно. Освен това билинейното филтриране е много по-взискателно към честотната лента на паметта, което като цяло е повече от логично, като се има предвид, че билинейното филтриране вече използва 4 тексела за определяне на цвета на пиксела.

Съдейки по информация във форуми и статии в Интернет, ATI си играе трикове с трилинейно филтриране на текстури на новия графичен процесор X800. Има обаче и такива, които яростно защитават ATi. Като цяло подобни дискусии ни напомнят за скандала, свързан с nVidia преди година.

Повод за такава разгорещена дискусия беше статия в немския уебсайт Computerbase. Той показа как ATI използва оптимизирано трилинейно филтриране на текстури, често наричано "брилинейно" поради комбинацията от билинеарно и трилинейно филтриране, на графичните процесори Radeon 9600 и X800. Новината беше наистина зашеметяваща, тъй като ATI винаги е говорил за използването на истинско трилинейно филтриране.

Но как изглежда ситуацията в действителност? Това оптимизация ли е, трик или просто умно решение? За да преценим, трябва да се задълбочим в технологията зад различните методи за филтриране. И първата част на статията ще бъде посветена точно на това, като ще представим някои технологии в много опростен вид, за да ги поберем в няколко страници. Така че нека да разгледаме основните и основни функции на филтрирането.

Ще има ли продължение? Може би, тъй като спорът за наскоро откритото брилинеарно филтриране на картите Radeon 9600 и X800 продължава. Трябва да се отдаде дължимото на ATi, че качеството на картината на картите не страда визуално поради това филтриране. Поне нямаме примери, които да предполагат обратното. Досега брилинната филтрация се проявява при изкуствено създадени лабораторни условия. В същото време ATi не ви позволява да активирате пълно трилинейно филтриране за споменатите карти, било то адаптивно или не. Поради новото филтриране, стойностите на производителността в тестовете не показват пълния потенциал на X800, тъй като стойностите на FPS са получени след оптимизация, чието влияние върху скоростта е трудно да се оцени. А думата „адаптивен“ оставя горчив привкус. ATI не ни предостави никаква информация за това как работи драйверът и многократно е заявявал, че картата предлага пълно трилинейно филтриране. Едва след гореспоменатото разкритие ATi призна, че филтрирането е оптимизирано. Да се ​​надяваме, че на други места в драйвера няма такава "адаптивност".

Въпреки това производителите бавно, но сигурно се придвижват към точката, в която нивото на толерантност ще бъде преодоляно. „Адаптивността“ или дефиницията на стартираното приложение не позволява на бенчмарк програмите да показват реалната производителност на картата в игрите. Качеството на картината в играта може да варира от един драйвер до друг. Производителите са свободни да се забавляват с водача, в зависимост от това от какво представяне се нуждае маркетинговият отдел в момента. Е, тук вече никого не интересува правото на потребителя да знае какво всъщност купува. Всичко това е оставено на медиите – нека си изпълнят просветителската мисия. И триковете за филтриране, които обсъдихме в нашата статия, са само най-известните такива случаи. Какво друго е скрито от нашето внимание, може само да се гадае.

Всеки производител сам решава какво ниво на качество на изображението ще осигури като стандарт. Въпреки това, производителите трябва да документират оптимизациите, които използват, особено ако са скрити от известни бенчмаркове, както в скорошния пример на ATI. Решението е очевидно: дайте възможност за изключване на оптимизациите! Тогава потребителят ще може сам да реши кое е по-важно за него - повече FPS или по-добро качество. Не можете да разчитате и на Microsoft като арбитър. WHQL тестовете не измерват много неща и могат лесно да бъдат заобиколени: Знаете ли значението на думата „отзивчив“?

Понастоящем известни оптимизации за филтриране
ATi nVidia
Трилинейна
оптимизация
R9600
X800
GF FX5xxx
(GF 6xxx)*
Ъглова оптимизация
анизотропно филтриране
R9xxx
X800
GF 6xxx
Адаптивна
анизотропно филтриране
R9xxx
X800
GF FX5xxx
GF 6xxx
Оптимизация на етапа R9xxx
X800
GF FX5xxx
LOD оптимизация R9xxx
X800(?)

Като цяло подобни дискусии имат своите предимства: купувачите и евентуално OEM клиентите започват да се вслушват в проблема. Не се съмняваме, че манията за необуздана оптимизация ще продължи. В тъмното кралство обаче се появи лъч светлина, което беше ясно демонстрирано от nVidia с нейната трилинейна оптимизация. Да се ​​надяваме на следващи подобни стъпки!

КАТЕГОРИИ

ПОПУЛЯРНИ СТАТИИ

2023 “kingad.ru” - ултразвуково изследване на човешки органи