3DGiТоги январь 2002 года: Исследование анизотропной фильтрации
Как уже широко известно, видеочипсеты NVIDIA GeForce256, GeForce2, GeForce3, GeForce4, ATI RADEON, RADEON 7500, RADEON 8500,
STM KYRO, KYRO II обладают такой ныне популярной функцией, как
анизотропная фильтрация.
Уже на протяжении года мы уделяем этой функции самое пристальное внимание. И это неудивительно, поскольку
она позволяет значительно улучшить качество восприятия трехмерных сцен. Кратко я напомню, что для устранения
артефактов (т.н. песка) по мере удаления текстурированных объектов от наблюдателя применяется технология
MIP-mapping-а, создающая для каждой текстуры набор ее копий разной детализации (т.н. MIP-уровней), выбираемых
при построении изображения в зависимости от расстояния от масштаба с которым текстура в результате закраски
проецируется на экран. Чем дальше от нас удаляется треугольник, тем менее детализованный и, следовательно, более
размытый MIP-уровень текстуры будет использован. Это соответствует нашему зрению (дальние объекты мы видим уже
не такими четкими, как близкие). Резкими границами между MIP-уровнями "занимается" трилинейная фильтрация,
сглаживая эти переходы с помощью линейной интерполяции между двумя соседними уровнями. Таким образом, билинейная
фильтрация занимается удалением резких границ между пикселами текстуры (дабы мы видели
стены и пол покрытыми не квадратиками, а сглажеными и более похожими на естественную плавно меняющуюся окраску
материалами), а трилинейная дополнительно размывает картину, еще раз интерполируя результаты двух билинейно фильтрованных
MIP-уровней. В результате четко видны только самые близко расположенные объекты.
При этом расположенные под
достаточно острым углом к направлению взгляда стены черезмерно смазываются. Справляться с такими "неудобными" для
обычной билинейной и трилинейной фильтрации объектами и призвана анизотропная фильтрация, сохраняющая
четкую картинку для расположенных под углом плоскостей и одновременно не допускающая "песок" на текстурах
при черезмерном удалении от объекта.
Давайте рассмотрим работу этой функции на двух примерах: 3DMark2001 (Direct3D) и Serious Sam (OpenGL). Все выше
перечисленные карты поддерживают использование анизотропии, если того пожелает приложение (игра), и лишь
некоторые могут форсировать включение анизотропной фильтрации вне зависимости от того - понимает игра эту
функцию или нет. Практически все карты умеют это делать в OpenGL даже без применения утилит-твикеров, то есть
возможности включения форсирования анизотропии имеются в настройках драйверов. Должен отметить как недостаток
драйверов от NVIDIA версий 21.* и более младших, то, что флажок активизации этой функции в настройках драйверов
работает некорректно и не дает возможности выбора уровня фильтрации (особенно это касается GeForce3). Только
в 22.* и более поздних версиях появилось корректное форсирование анизотропии с выбором ее уровня. Однако о
недостатках этих драйверов я уже писал на главной странице, поэтому все же рекомендую использовать утилиту
RivaTuner для беспроблемной настройки (в том числе и управления
анизотропией) карт на чипах от NVIDIA.
Анизотропия в Direct3D: NVIDIA GeForce3/4 и ATI RADEON 8500
Мы знаем, что реализация этой функции у разных фирм-производителей видеопроцессоров - различная. Да и скоростные
характеристики анизотропий, скажем, от ATI и от NVIDIA, сильно отличаются. Схоже только результирующее качество.
Так ли это? Постоянные читатели наших материалов знают, что анизотропия от NVIDIA (речь идет о GeForce3)
отличается высоким качеством, но и чрезмерным аппетитом. Падение производительности может достигать до 50%!
Анизотропия от ATI (речь идет о RADEON 8500) гораздо более дешевая и, как считалось до недавнего времени,
имеет не меньшее качество.
Как обычно, качество анизотропии оценивается на примерах стен, полов, площадей и т.п. Читатели видят
четкие линии и радуются качеству этой функции. Но вот бдительные читатели заметили, что не все гладко в
"канадском государстве". На некоторых поверхностях, находящихся под разными углами, отличными от
90 градусов, RADEON 8500 просто не воспроизводит анизотропию. Посмотрите на скриншоты, полученные в игре
Serious Sam при повороте наблюдателя относительно стены:
ATI RADEON 8500
NVIDIA GeForce4
Для удобства восприятия я сделал анимированные GIF-файлы:
| ATI RADEON 8500 |
NVIDIA GeForce4 |
|
|
Прекрасно видно, что на ряде углов зрения четкости у RADEON 8500 как ни бывало. Не это ли и является причиной
вычислительной дешевизны анизотропии от ATI? А вот у NVIDIA GeForce3 и GeForce4 все "честно", если можно, конечно,
считать способы реализации этой функции честными и нечестными. Плохо, что производители не предоставляют
пользователям сознательного выбора: использовать честную анизотропию с большими потерями или "аппроксимацию",
но более дешевую. Пока такой выбор может быть осуществлен только косвенно - выбором карты.
И все же нельзя напрямую оперировать понятием "честности" в отношении анизотропии. Если
трилинейку мы можем достаточно строго оценивать, поскольку ее алгоритм однозначен и хорошо описан,
то технология осуществления анизотропной фильтрации не разглашается производителем, а базовых
подходов для выполнения такой фильтрации известно как минимум пол десятка. И это не считая нюансов
реализации! Давайте подробно остановимся на реализациях этой функции у двух компаний.
Различия подходов NVIDIA и ATI к практической реализации анизотропной фильтрации
Если билинейная и трилинейная фильтрация достаточно четко опеределены математически (что, впрочем, не
помешало NVIDIA в свое время называть в некоторых документах трилинейной фильтрацией некий метод
аппроксимации - дизеринг значений из разных MIP уровней), то термин "анизотропная фильтрация" не подразумевает
каких-то конкретных алгоритмов ее реализации. Подходы NVIDIA и ATI в этом вопросе существенно разнятся.
Давайте (схематически) познакомимся с ними:
NVIDIA поступает довольно прямолинейно. На схеме показано, как происходит в пространстве текстуры
выборка билинейных семплов в процессе анизотропной фильтрации. В зависимости от установок качества
фильтрации и угла наклона поверхности относительно плоскости экрана, выполняется от одного до четырех
раз стандартная би- (или три-) линейная фильтрация для точек, лежащих на прямой, проведенной по делящей
проектируемый из экрана в поверхность текстуры пиксель вдоль его длинной стороны (на схеме
изображена стрелкой). Полученные таким образом значения (синие кружки) усредняются - это и будет
результатом фильтрации. Каждое значение основывается на четырех ближайших дискретных значениях
текстуры (прямоугольники) и может иметь собственные независимые координаты. Такой подход годится для
произвольно ориентированных текстур, но требует изрядной производительности - для заметной части
непараллельных экрану треугольников в несколько раз возрастает число выбираемых текстурных семплов, и,
соответственно, время закраски.
Подход ATI более ограничен, но и более производителен:
Как мы видим, значения выбираются цепочкой, причем она может быть ориентирована в плоскости
текстуры строго горизонтально или вертикально. Т.е. для близких к ортам значений проекционного вектора
(стрелка на схеме) качество фильтрации будет высоким, но по мере его поворота эффект будет
сходить на нет, вплоть до полной потери смысла в использовании такого метода. В реальных приложениях это
выразится следующим образом - на стенах или потолках фильтрация будет работать на все сто, в то
время как на наклоненных под непрямыми углами поверхностях ее результат будет все менее и менее
заметен по мере приближения к критическому углу в 45 градусов (что мы и наблюдали выше). Но, с другой
стороны, подобный подход гораздо более выгоден с вычислительной точки зрения. Во-первых, мы выбираем
организованные цепочки размером от 2хN точек текстуры (на схеме квадратики), которые можно эффективно
выбрать за N/2 тактов с помощью стандартных, рассчитанных на билинейную фильтрацию текстурных блоков.
Затем, мы фильтруем значения (на схеме кружки), используя каждый раз одни и те же смещения относительно
дискретных точек исходной текстуры. Подобная операция может быть выполнена за один такт специальной
схемой из десяти умножителей, встроенной в текстурный блок, благо само значение параметров интерполяции
вычисляется один раз и остается неизменным для всех 1..5 вычисляемых точек. Кроме того, мы можем
существенно ускорить этот и так достаточно производительный алгоритм, заранее вычислив специально
сжатые по осям варианты текстуры (т.н. RIP mapping).
Суммируя вышесказанное, отметим, что подход NVIDIA требует большее время на вычисление результата, но
и является более "честным", одинаково хорошо справляясь с объектами, расположенными под любыми углами
наклона, а не только строго горизонтально или вертикально по отношению к наблюдателю. В методе ATI
заложено свое рациональное зерно - большинство современных игр изобилуют в основном горизонтальными и
вертикальными поверхностями.
До последнего времени козырем карт на базе GeForce-процессоров была возможность форсирования анизотропии в
Direct3D (разумеется, неофициально, а через внесение изменений в Registry или через тот же RivaTuner), чего
были лишены карты на базе ATI RADEON. Последние могли довольствоваться только возможностями игр, понимающих
эту функцию.
И вот, начиная с версии драйверов 9,003 (для Windows 9x/ME) и 6.006 (для Windows 2000/XP), такая возможность
появилась и у RADEON. У версии до 9.012 - неофициально, а через Registry:
Обратите внимание на число в левом поле, обведенное красным. Оно может быть разным на разных компьютерах,
поэтому вначале убедитесь, что вы находитесь в нужной ветке. Надо создать переменную AnisoDegree, которой и
присваивать уровень анизотропии: 4,16,64,128. Сразу скажу, что пока наивысшим уровнем является 16, активизация
более старших степеней желаемого результата не приносит, производительность и качество остаются такими же, что
и при х16. Версии драйверов 9.012 и выше уже обеспечивают нормальное функционирование анизотропии в Direct3D
через настройки.
Поскольку сейчас основной спор идет между NVIDIA GeForce3 Ti200/500 и ATI RADEON 8500LE/8500, то мы рассмотрели
работу этих карт при форсировании анизотропии в 3DMark2001. При этом использовался не самый высокий уровень
фильтрации у GeForce3 (Level 4), и наивысшая на сегодня фильтрация у RADEON 8500. Почему такая несправедливость?
Ниже будет понятно.
3DMark2001
Производительность у GeForce4 при активной анизотропии в данном материале еще не рассматривалась! Прошу
прочитать обзор по GeForce4
Обратите внимание на то, что почти везде падение производительности у RADEON 8500 при максимально возможной
анизотропной фильтрации меньше, чем у GeForce3 Ti 500 при Level4, что является средним уровнем фильтрации. Это
четко доказывает то, что демонстрировать Level8 нет необходимости, ибо уже ясно, что он проиграет везде и вся.
Однако, теперь давайте еще раз, но более подробно, посмотрим на качество, которое нам дает форсирование этой функции у обеих карт.
|