Практичне використання розширень анізотропної фільтрації в OpenGL
Коротко про фільтрацію текстур – для чого вона існує? Попри сформовану думку про те, що фільтрація призначена тільки для поліпшення якості зображення - скажу так - це лише остаточний результат, який складається не тільки за рахунок самої фільтрації. Хоча подібне зауваження є найбільш справедливим для білінійної фільтрації, але про це дещо пізніше. Повернімося до OpenGL. При формуванні образу текстури в пам'яті програміст задає два рівні фільтрації текстур - кажучи більш простою і зрозумілою мовою це фільтри максимальної та мінімальної дистанції, яка з функцій фільтрації буде застосовуватися для формування образу текстури при сильному видаленні або достатньому наближенні текстурного зображення. Ти, напевно, вже дивився приклади з текстуруванням – якщо ні – раджу поглянути.
Розглянемо функцію при "достатньому наближенні": коли один тексель (один елемент або піксель якщо завгодно для (кращого розуміння) текстури) стає досить великим і покриває кілька пікселів на екрані для усунення ступінчастості ми використовуємо фільтрацію. Зауважу, що подібне рішення не досить ефективно – оскільки фільтрація дещо "змащує" зображення. Для надання більш реалістичного вигляду необхідно збільшувати роздільну здатність самої текстури. При цьому кожної апаратної реалізації максимальний розмір текстури свій. Отримати його можна, наприклад, за допомогою наступного коду (на замітку - текстури повинні мати розміри (ширина, довжина) кратні ступеня двійки.):
Поговоримо про мінімізацію текстурного зображення. Тут звичайно треба згадати про міпмапінг - справа в тому, що при достатньому видаленні текстури можуть виникнути небажані спотворення та артефакти (такзваний z-або depth-aliasing) у зображенні. Щоб уникнути цього, використовується генерація та збереження на стадії завантаження зменшених копій текстури для використання на різних дистанціях при видаленні. Для покращення якості отриманих зображень також використовується фільтрація.
Хочу зауважити, що при використанні спільно з міпмапінгом білінійної фільтрації (втім і без неї) виникає ефект mip-banding'а - візуально помітний перехід від одного міпмап рівня до іншого. Для боротьби з цим використовується більш вимоглива на час виконання трилінійна фільтрація.
Що ж тоді таке анізотропне фільтрування? Справа в тому, що білінійна та трилінійна фільтрація не зовсім коректно розраховує колір текселю - а точніше розраховує його невірно (відштовхуючись від законів нашого зору) для похилих площин. Використання анізотропної фільтрації доповнює поточні режими фільтрації, що дозволяє регулювати кут анізотропії. Чим більший кут - тим вища якість і реалістичність самої фільтрації, тим вище, водночас витрати на обрахунок. Не варто очікувати казкового покращення якості результату - швидше навпаки - на великих кутах ми отримаємо велику "змазаність" зображення - проте результуюче зображення є більш реалістичним.
В OpenGL анізотропна фільтрація реалізується розширенням GL_EXT_texture_filter_anisotropic. Можливо, з часом з'являться інші апаратно-специфічні варіанти анізотропної фільтрації - проте я орієнтувався саме на це розширення.
Ось приклад. Для зміни режиму фільтрації лівої та правої текстури використовуй клавіші '1' та '2'. Кути розташування полігонів змінюються кнопками курсору. Наближення та видалення полігонів здійснюється "сірими" плюсом та мінусом. У повноекранному режиміЗавершити роботу програми можна клавішами Alt+F4. Файли mainaux.cpp і mainaux.h містять функцію та константи для універсальної функції пошуку входження в рядок і можуть використовуватися не тільки для обробки рядка розширення OpenGL. Підтримка розширення визначається на етапі ініціалізації:
У разі відсутності анізотропної фільтрації приклад так само буде працездатний, однак будуть доступні всього три режими - відсутність фільтрації, білінійна і трилінійна. Якщо анізотропна фільтрація доступна – то в прикладі буде доступний ще один рівень фільтрації – з досить високим кутом анізотропії для трилінійної фільтрації: