Что такое anisotropic filtering в играх
Что такое анизотропная фильтрация и зачем ее включать
Почти во всех современных играх есть пункт в настройках графики “анизотропная фильтрация”, коротко АФ, но зачем ее включать и на что она влияет? Давай те разберемся вместе.
Как понятно из названия опции, АФ предназначена для “фильтрации текстур”. Данный параметр крайне рекомендуется выставлять в максимальное значение. Для ясности взгляните на изображение ниже.
Первый кадр не демонстрируется с полностью отключенным АФ, в то время как значение на втором кадре равно X16. Обратите внимание, что чем дальше дорого уходит от камеры игрока, тем больше уменьшается прорисовка текстур.
Если выбирать, какое значение выбрать, то знайте, разница в производительности между 8х и 16х ничтожна, поэтому мы рекомендуем выбрать все-таки x16.
Но эффект от фильтрации текстур лучше всего заметем в движении. Без АФ заметны “лесенки” в стыках текстур поверхностей. Как правило, анизотропная фильтрация может заметно повлиять на частоту кадров и съесть память вашей видеокарты, хотя это не всегда так и данный эффект разница от одного компьютера к другому.
Подводя итог, анизотропная фильтрация придает четкости текстурам на отдалении от игрока. Испытать вы можете эффективности АФ в своей любимой игре, лучше всего каком-нибудь шутере от первого лица.
Анизотропная фильтрация
Фильтрация текстур: основная идея
Чтобы понять разницу между различными алгоритмами фильтрации нужно сначала понять, что пытается сделать фильтрация. Ваш экран имеет определенное разрешение и состоит из того, что называется пикселями. Разрешение определяется количеством пикселей. Ваша 3D плата должна определить цвет каждого из этих пикселей. Основой для определения цвета пикселей служат текстурные изображения, которые накладываются на полигоны, расположенные в трехмерном пространстве. Текстурные изображения состоят из пикселей, называемых текселями. По сути, эти тексели являются пикселями 2D изображения, которые наложены на 3D поверхность. Главный вопрос таков: какой тексель (или какие тексели) определяет цвет пикселя на экране?
Представьте себе следующую проблему: предположим, что ваш экран это плита с большим количеством отверстий (давайте исходить из предположения, что пиксели имеют круглую форму). Каждое отверстие это пиксель. Если вы посмотрите через отверстие, вы увидите какой цвет оно имеет, соотносительно трехмерной сцены, раполагающейся за плитой. Теперь представьте себе световой луч, проходящий через одно из этих отверстий и попадающий на текстурированный полигон, расположенный за ним. Если полигон расположен параллельно экрану (т.е. нашей воображаемой плите с отверстиями), тогда световой луч попав на него образует круглое световой пятно (см. рис. 1). Теперь, вновь подключив воображение, заставим полигон вращаться вокруг своей оси и самые простые познания подскажут вам, что форма светового пятна изменится, и вместо круглой станет эллиптической (см. рис. 2 и 3). Вы, вероятно, желаете знать, какое отношение имеет это пятно света к проблеме определения цвета пикселя. Элементарно, все полигоны, расположенные в этом пятне света определяют цвет пикселя. Все, что мы тут обсудили и есть основные знания, которые необходимо знать для того, что бы понять различные алгоритмы фильтрации.
Посмотреть на различные формы светового пятна можно на следующих примерах:
1. Point Sampling
Point Sampling — поточечная выборка. Это самый простой способ определения цвета пикселя на основе текстурного изображения. Вам нужно всего лишь выбрать тексель, ближе всех расположенный к центру светового пятна. Разумеется, вы совершаете ошибку, так как цвет пикселя определяют несколько текселей, а вы выбрали только один. Вы так же не принимаете во внимание тот факт, что форма светового пятна может измениться.
Главный преимущество такого метода фильтрации — это низкие требования к ширине полосы пропускания памяти, т.к. для определения цвета пикселя вам нужно выбрать всего лишь один тексель из текстурной памяти.
Главный недостаток — это тот факт, что когда полигон расположен ближе к экрану (или точке наблюдения) количество пикселей будет больше, чем количество текселей, следствием чего станет блочность и общее ухудшение качества изображений.
Однако, главная цель применения фильтрации это не улучшение качества при сокращении расстояния от точки наблюдения до полигона, а избавление от эффекта неправильного расчета глубины сцены (depth aliasing).
2. Bi-Linear Filtering
Bi-Linear Filtering — билинейная фильтрация. Состоит в использовании интерполяционной техники. Иными словами, применительно к нашему примеру, для определения текселей, которые должны быть задействованы для интерполяции, используется основная форма светового пятна — круг. По существу, круг аппроксимируется 4 текселями. Этот способ фильтрации представляет собой существенно лучше поточечной выборки (point sampling), так как отчасти принимается во внимание форма светового пятна и используется интерполяция. Это означает, что если полигон приближается слишком близко к экрану или точке наблюдения, то для интерполяции потребуется больше текселей, чем в действительности доступно. В результате получается прекрасно выглядящее расплывчатое изображение, впрочем это лишь побочный эффект.
Главный недостаток билинейной фильтрации в том, что аппроксимация выполняется корректно только для полигонов, которые расположены параллельно экрану или точке наблюдения. Если полигон развернут под углом (а это в 99% случаев), значит вы используете неправильную аппроксимацию. Неправильность заключается в том, что вы используете аппроксимацию круга, в то время, как должны аппроксимировать эллипс. Главная проблема в том, что при билинейной фильтрации требуется считывать по 4 текселя из текстурной памяти для определения цвета каждого выводимого на экран пикселя, а значит требования к ширине полосы пропускания памяти увеличиваются в четыре раза, по сравнению с поточечной фильтрацией.
3. Tri-Linear filtering
Tri-Linear filtering — трилинейная фильтрация, представляет собой симбиоз mip-текстурирования и билинейной фильтрации. Фактически, вы производите билинейную фильтрацию на двух mip уровнях, что в результате дает вам 2 текселя, по одному для каждого mip уровня. Цвет пикселя, который должен быть выведен на экран, определяется в результате интерполяции по цветам двух mip-текстур. По сути, mip уровни представляют собой заранее рассчитанные более маленькие версии исходной текстуры, а это означает, что мы получаем более хорошую аппроксимацию текселей, расположенных в пятне света.
Эта техника обеспечивает лучшую фильтрацию, но имеет лишь небольшие преимущества перед билинейной фильтрацией. Требования к ширине полосы пропускания памяти удваиваются, по сравнению с билинейной фильтрацией, так как вам необходимо считать 8 текселей из текстурной памяти. Использование мипмеппинга обеспечивает лучшую аппроксимацию (используется большее число текселей, расположенных в световом пятне) по всем текселям в световом пятне, благодаря использованию заранее рассчитанных mip-текстур.
4. Anisotropic filtering
Anisotropic filtering — анизотропная фильтрация. Итак, чтобы получить действительно хорошие результаты, вы должны помнить, что все тексели в световом пятне определяют цвет пикселя. Вы так же должны помнить, что форма светового пятна изменяется вместе с изменением положения полигона относительно точки наблюдения. До этого момента мы использовали лишь 4 текселя вместо всех текселей, покрываемых световым пятном. Это означает, что все эти техники фильтрации дают искаженный результат, когда полигон расположен дальше от экрана или от точки наблюдения, т.к. вы не используете достаточный объем информации. На самом деле вы осуществляете сверх меры фильтрацию в одном направлении, и совершенно недостаточно фильтруете во всех остальных. Единственным преимуществом у всех описанных выше фильтраций является тот факт, что при приближении к точке наблюдения, изображение выглядит менее блочным (хотя это всего лишь побочный эффект). Таким образом, чтобы добиться наилучшего качества, мы должны использовать все тексели, покрываемые световым пятном и усреднять их значение. Однако, это серьезно ударяет по пропускной способности памяти — ее попросту может не хватить, и выполнить такую выборку с усреднением нетривиальная задача.
Вы можете использовать разнообразные фильтры для аппроксимации формы светового пятна в виде эллипса для нескольких возможных углов положения полигона относительно точки зрения. Существуют техники фильтрации, которые используют от 16 до 32 текселей из текстуры для определения цвета пикселя. Правда использование подобной техники фильтрации требует существенно большей ширины полосы пропускания памяти, а это почти всегда невозможно в существующих системах визуализации без применения дорогостоящих архитектур памяти. В системах визуализации, использующих тайлы 1 существенно экономятся ресурсы полосы пропускания памяти, что позволяет использовать анизотропную фильтрацию. Визуализация с применением анизотропной фильтрации обеспечивает лучшее качество изображения, за счет лучшей глубины детализации и более точного представления текстур, наложенных на полигоны, которые расположены не параллельно экрану или точке наблюдения.
1 Tile (тайл) — плитка или фрагмент изображения. Фактически тайл представляет собой участок изображения, обычно с размером 32 на 32 пикселя; по этим участкам осуществляется сортировка с целью определения, какие полигоны, попадающий в этот тайл являются видимыми. Тайловая техника реализована в чипсетах VideoLogic/NEC.
Дополнительную информацию по данной теме можно прочитать здесь и здесь.
Анизотропная фильтрация: что это такое, на что влияет, нужно ли включать
Современные компьютерные игры немыслимы без использования изощрённых технологий, на базе которых разрабатываются эффекты, позволяющие улучшить качество картинки. Этот процесс можно назвать бесконечным – совершенствование технической базы сопровождается адекватным ростом разрешения монитора, поэтому борьбе за пиксели и ресурсы ПК не видно конца. С другой стороны, «в обороте» имеется значительное количество устаревшей техники, обладателям которой приходится решать очень серьёзные задачи по нахождению компромисса между качеством картинки и скоростью прорисовки. Анизотропная фильтрация – эффект, направленный на улучшение качества. Но какой ценой это достигается?
Что такое анизотропная фильтрация применительно к играм
Под термином анизотропная фильтрация (АФ) понимают метод, применяемый в трехмерных графических вычислениях, который способствует улучшению качества отрисовки текстур на поверхностях, расположенных под углом относительно игрока/зрителя.
Давайте попробуем разобраться, что значит использование анизотропной фильтрации с точки зрения используемой технологии.
Принцип работы АФ заключается в попиксельном анализе области отрисовываемой текстуры и построении шаблона по итогам произведённых вычислений с его выводом на монитор. Под очень большими углами каждый пиксель может охватывать область, которая задействована в большом количестве смежных участков текстуры, и именно поэтому анизотропная фильтрация достаточно требовательная к объёмам вычислений. И даже использование таких прогрессивных технологий, как кэширование данных по текстурам, не в состоянии существенно снизить потребление видеопамяти при использовании АФ.
Отдельные производители видеокарт разрабатывают собственные алгоритмы фильтрации, оптимизированные под прорисовку общих геометрических контуров, характерных для игр (стены, протолок, небо, пол).
Что даёт анизотропная фильтрация в современных играх? Прежде всего устраняет алиасинг, который характерен для наклонных текстур. Имеется в виду пикселизация изображения на подобных участках. Дополнительным эффектом АФ является сглаживание размытости таких текстур, что особенно заметно в сравнении с другими типами фильтраций, например, трилинейной и билинейной. Отметим ещё одну важную особенность анизотропной фильтрации: она касается только просчёта текстур на форме, но сама форма остаётся неизменной.
Из вышесказанного можно понять, для чего нужна в играх технология анизотропной фильтрации: она позволяет добиться большей детализации картинки. Из-за потребности в больших объёмах вычислений АФ стала доступной в массовой категории видеокарт примерно с 2004 года, хотя передовые модели графических адаптеров умели использовать эту технологию ещё с середины 90-х.
Её можно активировать либо в настройках видеоакселератора, и мы расскажем, как это сделать, либо непосредственно в используемом приложении, большинство игр имеют такую опцию в настройках.
Единственный параметр, который можно менять при использовании АФ – коэффициент фильтрации, принимающий одно из четырёх возможных значений (2x/4x/8x/16x). Что подразумевается под этими коэффициентами? Это количество обрабатываемых рядом стоящих текселей (число пикселей, приходящихся на определённый размер сцены), для которых производится усреднение цвета. Понятно, что чем ниже показатель, тем хуже будет проявляться эффект, но поскольку анизотропная фильтрация создаёт немалую нагрузку на оборудование, к выбору оптимального значения параметра следует подходить взвешенно, учитывая мощность видеокарты. Единственный момент, который бы хотелось уточнить, – между режимом 8х и 16х разница в производительности будет небольшая, так что последний можно рекомендовать как предпочтительный, если вы хотите получить идеальную картинку, особо не рискуя скоростью прорисовки.
Итак, мы выяснили, на что влияет анизотропная фильтрация: на производительность (fps) просчёта кадра и его качество, а поскольку NVidia и AMD используют одинаковый алгоритм АФ, то не имеет значения, какой бренд видеокарты установлен на вашем компьютере. Главное – насколько она мощная.
Если на слабом компьютере вы играете в требовательную к вычислительной мощности игру, режим сглаживания цвета вам принесёт больше неудобств и разочарований, чем практической пользы.
С практической точки зрения использование коэффициентов 8х и 16х при анизотропной фильтрации позволит получить менее заметные переходы в цвете при приближении к объекту, чем при более низких значениях параметра. С другой стороны, при резком ускорении объекта или повороте камеры пикселизации на стыках текстур не избежать.
Как включить режим анизотропной фильтрации
Если у вас установлен видеоадаптер Radeon, щелкните ПКМ по пустой области рабочего стола и в появившемся контекстном меню выберите «Настройки Radeon».
Если у вас установлена фирменная утилита AMD Radeon Software, просто запустите её. Затем перейдите во вкладку «Настройки» и выберите пункт «Видеокарта».
В списке доступных эффектов будет «Анизотропная фильтрация». Чтобы её включить, нужно передвинуть ползунок в соответствующее положение, и тогда станет доступным выбор параметра АФ, от 2х до 16х.
Тем, у кого имеется видеоадаптер NVIDIA, нужно открыть «Панель управления NVIDIA», выбрать вкладку «Параметры 3D» пункт меню «Управление параметрами 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 такая программа называется «The way it’s meant to be played», а у ATI – «Get it in the game». Всё достаточно красноречиво и понятно: NVIDIA говорит, что «играть нужно так», а совсем не эдак, а ATI уверяет, что всё, что мы только ни пожелаем, мы обязательно получим в самой игре. Достаточно заманчиво, не правда ли? Движки же класса «Doom 3» и «Half-Life 2» (в случае последней движок называется Source, однако для простоты восприятия мы будем называть его именно «Half-Life 2», чтобы сохранить правильную ассоциацию) и вовсе изначально разрабатываются в тесном сотрудничестве с инженерами производителей графических чипов, чтобы игры лучше работали именно на GPU какого-то одного производителя.
Поэтому, как мы можем видеть, революции в области новых графических 3D-движков делать весьма проблематично, и поэтому случаются эти самые перевороты в мире игровых движков не так уж и часто. Однако улучшать качество изображения каким-то образом нужно. Если просто увеличивать количество полигонов в кадре, тем самым получая визуально более красивую для восприятия картинку, то в итоге мы придём к тому, что акселератор не сможет обрабатывать сцену с приемлемым уровнем частоты кадров, но в картинке всё равно будет чего-то не хватать. Лесенки из пикселей всё равно останутся, да и качество текстур не улучшится. Остаются менее явные способы по улучшению качества трёхмерной картинки на мониторе – это анизотропная фильтрация и антиалиасинг. Непосредственно к самому 3D-движку эти техники улучшения изображения не имеют никакого отношения, и сделать сам движок более красивым они, естественно, не могут, однако они могут работать с текстурами и изображением таким образом, что на выходе, то есть на мониторе, мы можем видеть визуально более красивую и мягкую картинку.
Именно на поприще анизотропной фильтрации и антиалиасинга проходит колоссальнейшее количество оптимизаций драйверов как со стороны NVIDIA, так и со стороны ATI. У компаний различные подходы и политика в отношении этих самых оптимизаций, порой не совсем справедливая по отношению к пользователям. Однако наша статья как раз и призвана разобраться с тем, что же хорошего и что же плохого в подходах обеих компаний-производителей GPU и что на сегодняшний день может улучшить качество изображения в 3D-играх.
Что такое антиалиасинг и с чем его едят?
Перед тем как начать вдаваться в подробности относительно такой животрепещущей темы, как оптимизации антиалиасинга и различного типа фильтрации текстур, не помешает (и даже скажем больше – необходимо) приобрести некоторую порцию теоретических знаний по предмету нашего сегодняшнего разговора.
Итак, антиалиасинг – что же это такое и зачем он нужен. В первую очередь, в слове «антиалиасинг» необходимо выделить часть его – «анти». Предельно ясно, что это часть слова подразумевает то, что само явление «антиалиасинга» направлено на борьбу с чем-то. Как несложно догадаться, в нашем случае – с «алиасингом». Поэтому для нас на данный момент важно чётко разобраться в том, что же представляет из себя пресловутый «алиасинг».
Для начала нужно чётко понимать, что изображение, которое мы с вами можем ежедневно наблюдать на экранах наших с вами мониторов, состоит из так называемых мелких частичек, которые принято называть пикселями. Хорошей аналогией в этом смысле может послужить пример с бумагой в клеточку. Изображение на мониторе – это та же бумага в клеточку, только они в данном случае очень и очень мелкие. Если говорят, что разрешение экрана составляет 1024х768 при 32-битном цвете, то это означает, что по горизонтали на мониторе умещается 1024 точек, а по вертикали – 768. При этом каждая точка может быть закрашена одним цветом из доступных в 32-битной палитре. На данный момент 32-битный цвет – это предел того, чего мы можем добиться на экране компьютера. Лучшие умы человечества (тот же Кармак) уже поговаривают о необходимости перехода на 64-битный цвет и указывают на явные минусы 32-битной палитры. В своё время при переходе с 16-битного на 32-битный цвет данная необходимость была достаточно чётко обоснована и виделись реальные причины, по которым стоило бы перейти на 32 бит. Переход же на 64-битный цвет на сегодняшний день – это скорее излишество. Так же как и в случае с 16 и 32 битами, в своё время придётся достаточно долго ждать, когда акселераторы всех уровней смогут с приемлемой скоростью обрабатывать 64-битный цвет.
Подавляющее большинство статей, в которых затрагиваются тем или иным образом принципы построения изображений в 3D и где ведётся разговор об антиалиасинге, изобилуют простым, но вместе с тем наиболее действенным примером, на котором можно достаточно хорошо понять, что же такое антиалиасинг. Посмотрите на увеличенную надпись «Апгрейд», сделанную в Word’e, а затем просто увеличенную в фотошопе. Не очень хорошо выглядит, не правда ли? По бокам букв видна так называемая гребёнка или, как её ещё называют, «лесенка». В сущности, эта самая «гребёнка» или «лесенка» и есть алиасинг. Можно представить и другой пример в виде геометрического объекта, например, пирамиды. По её краям также хорошо видна всё та же «гребёнка». А теперь посмотрите на другое изображение той же пирамиды, но с увеличенным вдвое разрешением. Выглядит уже значительно лучше, и «гребёнка» практически незаметна. Как уже было сказано выше, данный эффект, сглаживающий «гребёнку», был достигнут за счёт того, что мы увеличили разрешение в 2 раза. Что это означает? Предположим, у нас была отрендерена пирамида с разрешением 200х200 пикселей (выше мы уже подробно прояснили вопрос о том, что такое пиксели и зачем они нужны). Мы увеличили количество точек по вертикали и по горизонтали ровно в 2 раза, то есть получили изображение с разрешением 400 точек по вертикали и 400 точек по горизонтали. Это также означает, что количество точек на нашем объекте, который находился на сцене, увеличилось вдвое. Что это дало применительно к нашему эффекту алиасинга? Очевидно, что он стал минимален, то есть сгладился – ведь количество точек по краям объекта также возросло вдвое. Именно слово «сгладился» является здесь ключевым. Ведь антиалиасинг по-иному называют сглаживанием, что отражает самую суть технологии, которая сглаживает ту самую «лесенку» по краям трёхмерных объектов.
На самом деле, после увеличения разрешения «лесенка» с края пирамиды никуда не делась – она остаётся там по-прежнему. Однако за счёт того, что мы увеличили разрешение (что означает увеличение точек, которые расходуются на отображение пирамиды), эффект «лесенки» сгладился благодаря особенностям человеческого зрения, которое уже менее чётко видит пиксели на крае объекта. Абсолютно понятно, что если увеличивать разрешение ещё и ещё, то эффект алиасинга будет наблюдаться всё в меньшей и меньшей степени. Точнее, человеческий глаз станет замечать его всё в меньшей и меньшей степени, поскольку сам эффект алиасинга никуда не денется. Но так же абсолютно понятно и то, что до бесконечности увеличивать разрешение не получится, ведь мониторы, пусть даже и самые современные, имеют конечные разрешения, причём не такие уж и большие, что не позволит нам постоянно увеличивать количество точек. Проще говоря, простейшего эффекта антиалиасинга можно добиться, всего лишь увеличив разрешение экрана, однако разрешение не может расти до бесконечности. Казалось бы, выхода нет? Однако в действительности он был найден, и основан он всё на той же особенности зрения человека.
Этого удалось достичь благодаря плавным переходам цветов на изображении. Фактически визуальное улучшение изображения производится не за счёт физического увеличения разрешения, а за счёт, если можно так выразиться, цветового увеличения разрешения. В данной статье мы не будем описывать алгоритмы вычисления этих точек и не будем вдаваться в глубины математических вычислений, а расскажем лишь о принципе работы такого антиалиасинга. Лесенка на границах объектов видна лишь потому, что чаще всего края трёхмерных объектов довольно сильно выделяются по цвету от остальной картинки и представляют собой тонкие линии в один пиксель. Это можно компенсировать, поставив некоторое количество точек с цветами, вычисляемыми по формуле из значений цвета самого края и точек рядом с этим краем. То есть, если край объекта чёрный, а фон белый, то дополнительная точка рядом с чёрной линией края станет серой. Чем больше этих дополнительных точек около края любого 3D-объекта, тем более гладко выглядят его края и тем меньше заметна лесенка. Данный способ называется краевым антиалиасингом. Качество антиалиасинга, задаваемое в драйвере видеокарты, как то: 2x, 4x, 6x, 8x означает количество проставляемых дополнительных пикселей вокруг линии, нуждающейся в сглаживании.
Анизотропная фильтрация: мини-ликбез для начинающих
Для того чтобы понять, что такое фильтрация, необходимо обладать некоторыми основными знаниями. Мы уже выяснили, что изображение на экране состоит из множества пикселей, количество которых определяется разрешением. Для вывода цветного изображения ваша видеокарта должна определять цвет каждого пикселя. Определяется его цвет посредством наложения текстурных изображений на полигоны, которые расположены в трёхмерном пространстве. Текстурные изображения состоят из пикселей, вернее, текселей, то есть тексель – это пиксель двухмерного изображения, наложенного на 3D-поверхность. Главная дилемма заключается в следующем: какой тексель или тексели определяют цвет пикселя на экране. Для представления проблемы фильтрации давайте представим одну картину. Допустим, что ваш экран – это плита с множеством круглых отверстий, каждое из которых является пикселем. Для того чтобы определить, какой цвет имеет пиксель относительно трёхмерной сцены, расположенной за плитой, достаточно просто посмотреть в одно из отверстий. А теперь представим луч света, который проходит через одно из отверстий и попадает на наш текстурированный полигон. Если последний расположен параллельно относительно отверстия, через которое проходит световой луч, то световое пятно будет иметь форму окружности. В противном случае, если полигон расположен не параллельно к отверстию, световое пятно искажается и имеет эллиптическую форму. Мы думаем, что многие читатели в это время задаются одним вопросом: «как связаны все эти плиты, отверстие, луч света с проблемой определения цвета пикселя?» Внимание! Ключевая фраза: все полигоны, расположенные в световом пятне, определяют цвет пикселя. Всё вышеизложенное и есть те необходимые базовые знания, которые нужны для того, чтобы понять различные алгоритмы фильтрации.
А теперь, чтобы вы лучше поняли, для чего нужна фильтрация, рассмотрим происходящие процессы на примере легендарной «Quake 3 Arena». Представьте какой какой-нибудь коридор с множеством квадратов и различных орнаментов (благо, в «Quake 3 Arena» этого хватает). Орнамент в начале коридора сильно детализирован, а ближе к концу коридора (горизонту) элементы орнамента становятся всё меньше и меньше, т.е. они отображаются меньшим числом пикселей. В результате теряются детали типа швов между элементами орнамента, что, соответственно, приводит к ухудшению качества изображения.
Проблема заключается в том, что драйвер графической карты не знает, какие детали в текстуре являются важными.
Point Sampling
Point Sampling (поточечная выборка) – самый простой способ определения цвета пикселя. Этот алгоритм основан на текстурном изображении: выбирается всего один тексель, который ближе всех расположен к центру светового пятна, и по нему происходит определение цвета пикселя. Нетрудно догадаться, что это совершенно не верно. Во-первых, цвет пикселя определяется несколькими текселями, а мы выбрали только один. Во-вторых, форма светового пятна может измениться, а алгоритм не принимает это во внимание. А зря!
Главным недостатком поточной выборки является тот факт, что когда полигон расположен близко к экрану, количество пикселей будет значительно выше, чем текселей, из-за чего качество изображения очень сильно пострадает. Так называемый эффект блочности, как мы полагаем, многие могли наблюдать в старых компьютерных играх, например, в том же легендарном «Doom».
У Point Sampling есть преимущество. Из-за того, что определение цвета пикселя осуществляется всего по одному текселю, данный метод не критичен к пропускной способности памяти, а это автоматически даёт данному способу фильтрации колоссальные диведенды в том плане, что на фильтрацию по данной схеме затрачивается очень мало ресурсов 3D-акселератора.
Bi-Linear Filtering
Bi-Linear Filtering – билинейная фильтрация, основанная на методе использования интерполяционной техники. Для определения нужных текселей используется основная форма светового пятна, то есть круг. В нашем примере с кругом последний аппроксимируется 4 текселями. Как видим, здесь дела обстоят несколько лучше, чем с Point Sampling. Билинейная фильтрация использует уже 4 текселя. Изображение получается более качественным, блочность отсутствует, однако близкие к экрану полигоны выглядят расплывчато, и связано это с тем, что для интерполяции необходимо большее количество текселей, нежели доступные четыре.
Расплывчатость – отнюдь не самая главная проблема билинейной фильтрации. Дело в том, что аппроксимация выполняется корректно лишь для объектов, расположенных параллельно экрану или точке наблюдения, в то время как 99% объектов в любой компьютерной игре расположены непараллельно к точке наблюдения. Отсюда можно сделать вывод, что 99% объектов будут аппроксимироваться неправильно. Возьмём, к примеру, наш круг – полигон расположен непараллельно относительно точки наблюдения, стало быть, мы должны аппроксимировать эллипс, а мы аппроксимируем круг, что крайне неверно. Ко всему прочему билинейная фильтрация значительно требовательней к пропускной полосе данных памяти, что, в общем-то, более чем логично, учитывая то, что билинейная фильтрация использует уже 4 текселя для определения цвета пикселя.
Как видим, билинейная фильтрация выглядит несколько лучше, нежели Point Sampling. И всё же она очень далека от идеала.
Tri-Linear filtering
Tri-Linear filtering – трилинейная фильтрация, представляет собой симбиоз билинейной фильтрации и mip-текстурирования. Прежде чем говорить об алгоритме работы трилинейной фильтрации, давайте выясним, что такое МIP-текстурирование. MIP-текстурирование, или mip-mapping, – это метод уменьшения объёма вычислений, необходимых для точного наложения текстурного изображения на полигон. По сути, мипмеппинг выполняет те же задачи, что и Point Sampling, но делает это на порядок лучше. MIP-текстурирование призвано избавить нас от ухудшений изображений, когда несколько текселей накладываются на один пиксель. Посмотрим на проблему глобальней и попробуем найти решение всему этому. Для того чтобы правильно вывести пиксель на экран, необходимо скомбинировать значения всех текселей, которые и будут накладываться на этот пиксель. Но пропускная способность памяти не бесконечна, а это огромнейший обьём работы, который неблагоприятно отразится на быстродействии вашей видеокарты. Mip-mapping способствует снижению объёмов этой работы. Метод MIP-текстурирования основан на генерации и хранении множества версий исходного текстурного изображения. Эти версии имеют большое количество разрешений, каждое из которых всё меньше и меньше исходного. Во время текстурирования пикселя вам достаточно выбрать версию текстурного изображения. В вашем распоряжении есть 4 близлежащих текселея из текстурного изображения, больших по размеру, чем пиксель, и столько же текселей, меньших по размеру, чем пиксель. По сути, mip-уровни представляют собой заранее рассчитанные, более маленькие версии исходной текстуры, из-за чего обеспечивается лучшая аппроксимация.
Итак, мы выяснили, что такое mip-mapping, теперь вернёмся к нашей трилинейной фильтрации. Как мы уже говорили, Tri-Linear filtering представляет собой симбиоз билинейной фильтрации и mip-текстурирования. По сути, билинейная фильтрация производится на двух mip-уровнях. А в итоге мы имеем 2 текселя, по одному для каждого mip-уровня. Цвет пикселя определяется при помощи интерполяции по цветам двух mip-текстур.
В итоге имеем несколько лучшее качество фильтрации, нежели у билинейной. Стоит отметить, что качество улучшается незначительно, а требования к ширине полосы пропускания памяти в сравнении с той же Bi-Linear Filtering удваиваются.
Anisotropic filtering
Выше мы уже выяснили, что для получения хороших результатов фильтрации недостаточно определять цвет по нескольким пикселям. Используя всего четыре пикселя для определения цвета, мы получаем искажённую картину, используем недостаточный обьём фильтрации или, выражаясь простым языком, совершаем сверхфильтрацию в одном месте нашего светового пятна и недостаточно фильтруем в другом. Добавьте сюда изменение формы светового пятна и то, что ни один из вышеизложенных алгоритмов фильтрации этого не учитывает.
Вполне очевидно – для того чтобы добиться лучшего качества, необходимо использовать все пиксели светового пятна с усреднённым значением. Существуют техники фильтрации, которые применяют от 16 до 32 текселей для определения цвета пикселя. Мы также должны учитывать тот факт, что форма светового пятна изменяется вместе с изменением положения полигона относительно точки наблюдения. Собственно говоря, этим и предлагает пользоваться анизотропная фильтрация.
Всё это, конечно, хорошо, но использование такого количества пикселей требует огромной пропускной способности памяти, поэтому анизотропная фильтрация более-менее сносно может функционировать лишь на мощных современных видеокартах.
Помимо всего этого, Anisotropic filtering предлагает задействовать разнообразные фильтры для аппроксимации формы светового пятна. Эти фильтры имеют форму эллипса для нескольких возможных углов положения полигона.
В видеорешениях, использующих тайловую (тайл, говоря простым языком, – участок изображения опредёленного размера, как правило, 32х32 пикселя) архитектуру, благодаря применению тайлов, существенно экономятся ресурсы полосы пропускания памяти, что позволяет использовать анизотропную фильтрацию без значимых потерь быстродействия. При помощи анизотропной фильтрации можно получить лучшее качество изображения. Оно достигается за счёт более точного представления текстур и улучшенной глубины детализации.
Уровень анизотропной фильтрации определяется числом текселей, которые обрабатываются при вычислении конечного пикселя. Современные графические решения позволяют выставить уровень фильтрации в драйвере. Самыми распространёнными уровнями фильтрации являются 2x (16 текселей), 4x (32 текселя), 8x (64 текселя) и 16x (128 текселей). Очевидно, что при повышении уровня анизотропной фильтрации нагрузка на полосу пропускания памяти также увеличивается, а это неминуемо сказывается на производительности.
Оптимизации анизотропной и трилинейной фильтраций сегодня
Компании-разработчики графических чипов ATI и NVIDIA всё время стараются выжать дополнительную производительность из своих продуктов. Что, в общем-то, очевидно и оправдано – конкуренцию между двумя гигантами-производителями графических процессоров никто не отменял. Для достижения своих целей вендоры применяют различные оптимизации, которые позволяют увеличить производительность графических решений. Однако зачастую оптимизации повышают производительность, но снижают качество картинки. Увы, но поговорка «сделать быстрей – не значит сделать лучше» очень часто актуальна для ситуации с различными оптимизациями ATI и NVIDIA. Разработчики пытаются играть на всё тех же особенностях зрения человека и стараются повысить производительность за счёт слабозаметного ухудшения качества изображения.
Возьмём, к примеру, брилинейную фильтрацию. Нет-нет, мы не оговорились, именно брилинейная фильтрация. Так сказать, новый вид, который появился благодаря упорным стараниям вендоров. Брилинейная фильтрация представляет собой смешанный режим фильтрации между билинейной и трилинейной – область, в которой граничат соседние mip-уровни, и которая, собственно говоря, подвергается трилинейной фильтрации, была уменьшена. Вследствие этого удалось поднять производительность, что вполне ожидаемо, ведь мы фильтруем гораздо меньше. При этом качество изображения становится хуже, однако ухудшение качества в данном случае явно оправдано, если учесть значительный выигрыш в производительности. Это отчётливо видно, если сравнивать изображения, полученные с помощью полной трилинейной фильтрации.
Брилинейную фильтрацию впервые применила NVIDIA на своих видеокартах GeForce FX 5xxx Новые видеокарты GeForce 6xxx также используют брилинейную фильтрацию, однако компания NVIDIA после критики и различных дискуссий в многочисленных конференциях добавила возможность отключения оптимизации.
В недалёком прошлом продукты компании ATI славились более высоким качеством картинки, нежели таковые от NVIDIA. Однако с выходом графического процессора Radeon 9600 всё изменилось – последний, как и более новое решение Radeon X800, также использует брилинейную фильтрацию. Однако, в отличие от NVIDIA, ATI не соизволила не только объяснить процедуру фильтрации, но и не признала сам факт использования оптимизаций.
Компания ATI пошла на хитрость: драйверы переключаются на полную трилинейную фильтрацию при использовании цветных mip-текстур. Именно последние применяются в стандартных тестах качества, которые используют обозреватели и тестировщики.
Однако находчивые ребята с сайта Computerbase обнаружили, что в компьютерной игре «Call Of Duty» X800 даёт меньшую частоту кадров при использовании цветных mip-текстур. После чего обозреватели Computerbase провели сравнение качества изображения. Как оказалось, при применении обычных текстур Radeon X800 использует брилинейную фильтрацию. При употреблении цветных текстур в «Call Of Duty» (1600х1200) общий показатель FPS Radeon Х800 падает на 11-13 fps.
Самое интересное, что ATI заявляет об использовании полноценной трилинейной фильтрации и рекомендует тестировщикам отключать оптимизации у конкурентов для обеспечения честного сравнения.
В интервью популярному сайту Toms Hardware Guide компания ATI всячески уходила от конкретного ответа, утверждая, что X800 использует полноценную трилинейную фильтрацию. На этом оптимизации от компании ATI не заканчиваются. Так, продукты канадской фирмы ATI используют ещё один вид оптимизации, который называется «stage optimization» – оптимизацией ступени. Метод оптимизации основан на применении «трилинейной» (брилинейной) фильтрации только к первой ступени текстуры (0). Остальные ступени 1-7 фильтруются простым билинейным методом.
Стоит отметить, что во многих играх это не критично, поскольку верхние ступени текстур являются либо картами неровностей, либо картами освещения, для которых полноценная фильтрация не критична, поэтому ухудшения изображения вы попросту не заметите. Однако есть и исключения. Популярная компьютерная игра «Unreal Tournament» использует карты деталей с высоким разрешением на ступенях 1-7, поэтому потери в качестве неизбежны.
Также стоит оговориться, что эта оптимизация функционирует только при насильственном включении анизотропной фильтрации в драйверах вашей видеокарты. Если вы оставляете выбор приложению (by application), то обеспечивается полноценная «трилинейная» (брилинейная) фильтрация ко всем ступеням текстуры.
Компания NVIDIA также стала использовать эту оптимизацию, которая появилась в драйверах версии 51.xx для карт GeForce 5xxx.
Адаптивная анизотропная фильтрация – ещё одна вариация на тему оптимизаций. Её уже давно используют продукты компании ATI. NVIDIA также не отстаёт – в GeForce 6800 эта оптимизация частично реализована.
Алгоритм адаптивной анизотропной фильтрации заключается в том, что поверхности 3D-изображения получают различный уровень анизотропной фильтрации в точке наблюдения. Такой подход позволяет существенно экономить вычислительные ресурсы и тем самым значительно повышать общий fps.
Использование такого метода фильтрации оправданно. Представьте себе сцену из какой-нибудь компьютерной игры: скажем, ваш герой стоит лицом к стене. Фильтровать стену с уровнем анизотропной фильтрации 16х не имеет смысла, то есть картинка будет такой же, как и с 2х. Идея адаптивной анизотропной фильтрации очевидна: «сэкономь вычислительную мощность там, где это можно, дабы последняя не расходовалась впустую».
Вы вряд ли заметите существенное ухудшение качества от использования адаптивной анизотропной фильтрации, однако в некоторых сценах этот алгоритм немного грешит, то есть можно заметить определённую потерю качества.
Напоследок хотелось бы отметить, что вендорам было бы неплохо реализовать возможность отключения адаптивной анизотропной фильтрации.
Продолжение читайте во второй части нашего материала, посвящённой тестированию производительности.
Продолжение читайте во второй части обзора.