Практическо използване на разширения за анизотропно филтриране в OpenGL
Накратко за филтрирането на текстури - защо съществува? Противно на преобладаващото мнение, че филтрирането има за цел само да подобри качеството на изображението - ще кажа това - това е само крайният резултат, който се формира не само поради самото филтриране. Въпреки че тази забележка е най-вярна за билинейното филтриране, но повече за това по-късно. Да се върнем на OpenGL. Когато формира изображение на текстура в паметта, програмистът задава две нива на филтриране на текстурата - на по-прост и разбираем език, това са филтрите за максимално и минимално разстояние, коя от функциите за филтриране ще се използва за формиране на изображението на текстурата, когато изображението на текстурата е далеч или достатъчно близо. Вероятно вече сте разглеждали примери за текстуриране - ако не, съветвам ви да погледнете.
Помислете за функцията при „достатъчно мащабиране“: когато един тексел (един елемент или пиксел, ако искате за (по-добро разбиране на) текстурата) стане достатъчно голям, за да покрие няколко пиксела на екрана, ние използваме филтриране, за да елиминираме псевдонимите. Отбелязвам, че такова решение не е достатъчно ефективно - защото филтрирането донякъде "размазва" изображението. За да придадете по-реалистичен вид, трябва да увеличите резолюцията на самата текстура. В същото време за всяка хардуерна реализация максималният размер на текстурата е различен. Можете да го получите, например, като използвате следния код (забележка - текстурите трябва да имат размери (ширина, дължина), които са кратни на степен две.):
Нека поговорим за минимизиране на изображението на текстурата. Тук, разбира се, трябва да споменем mipmapping - факт е, че при достатъчно отстраняване на текстурата може да възникнат нежелани изкривявания и артефакти (т.наречен z- или псевдоним на дълбочина) в изображението. За да се избегне това, генерирането и запазването на етапа на зареждане на намалени копия на текстурата се използва за използване на различни разстояния при премахване. Филтрирането се използва и за подобряване на качеството на получените изображения.
Искам да отбележа, че когато се използва билинейно филтриране заедно с mipmapping (но без него), възниква ефектът на mip-banding - визуално забележим преход от едно ниво на mipmap към друго. За борба с това се използва по-отнемащо време трилинейно филтриране.
Какво тогава е анизотропно филтриране? Факт е, че билинейното и трилинейното филтриране не изчислява правилно цвета на тексела - или по-скоро го изчислява неправилно (въз основа на законите на нашето зрение) за наклонени равнини. Използването на анизотропно филтриране допълва текущите режими на филтриране, като ви позволява да регулирате ъгъла на анизотропия. Колкото по-голям е ъгълът, толкова по-високо е качеството и реализма на самата филтрация, толкова по-висока е в същото време цената на изчислението. Не бива да очаквате баснословно подобрение в качеството на резултата - точно обратното - при големи ъгли ще получим по-голямо "размазване" на изображението - въпреки това полученото изображение е по-реалистично.
В OpenGL анизотропното филтриране се реализира от разширението GL_EXT_texture_filter_anisotropic. Може би с времето ще се появят други специфични за хардуера варианти на анизотропно филтриране - но аз се съсредоточих върху това разширение.
Ето един ПРИМЕР. За да промените режима на филтриране на лявата и дясната текстура, използвайте клавишите '1' и '2'. Ъглите на полигоните се променят с курсорните клавиши. Приближаването и премахването на полигоните се извършва чрез "сиви" плюс и минус. В режим на цял екранМожете да излезете от приложението, като натиснете Alt+F4. Файловете mainaux.cpp и mainaux.h съдържат функцията и константите за общата функция за търсене на срещания низ и могат да се използват за повече от обработка на низове на разширение OpenGL. Поддръжката на разширение се определя по време на фазата на инициализация:
При липса на анизотропно филтриране примерът също ще работи, но ще са налични само три режима - без филтриране, билинеен и трилинеен. Ако е налично анизотропно филтриране - тогава в примера ще бъде налично още едно ниво на филтриране - с достатъчно висок ъгъл на анизотропия за трилинейно филтриране: