Бородинская битва между ATI RADEON X800 XT и NVIDIA GeForce 6800 Ultra

Картина третья: Трилинейная фильтрация (синтетические примеры)






СОДЕРЖАНИЕ

  1. Введение, немного теории
  2. Изображения
  3. Числа и графики
  4. Заключение


Введение

В последнее время все чаще стали возникать вопросы о реализации фильтрации текстур (texture filtering) в видеочипах. Казалось бы, при современных возможностях видеочипов такая основная их функция, как фильтрация текстур, будет выполняться идеально, ведь у производителей была возможность оттачивать ее, начиная с самых первых поколений своих 3D-ускорителей. А при современном бюджете транзисторов (счет пошел уже на сотни миллионов) можно реализовать текстурную фильтрацию идеально.

Но оказывается у каждого "идеала" есть свой предел, когда дальнейшее приближение к совершенной реализации уже не дает очевидной отдачи. Возможно, первыми затронули данный аспект наши коллеги с 3DCenter.org. Далее NVIDIA во всей линейке видеокарт на NV3x форсировала использование "оптимизированной" трилинейной фильтрации. А недавно оказалось, что ATI использует похожую "оптимизацию" в своих новых чипах, начиная с RV3x0 и заканчивая новейшим R420.

Цель данной статьи — продемонстрировать и проанализировать различия в реализации трилинейной фильтрации в чипах ATI и NVIDIA в их высококачественном и оптимизированном виде на последнем поколении чипов R420 — Radeon X800 и NV40 — GeForce 6800, соответственно.

Давайте немного определимся с терминами:

Трилинейная фильтрация (trilinear filtering (trilinear MIP mapping)) — дальнейшее развитие билинейной фильтрации (bilinear filtering) c MIP-маппингом (MIP mapping). Результатом трилинейной фильтрации является взвешенное среднее значение между результатами двух билинейных выборок из соседних MIP-уровней текстуры. В зависимости от соотношения размеров пиксель/тексель преобладает значение одной из двух билинейных выборок. Такой метод предотвращает мерцание и резкую смену четкости текстур при движении камеры относительно объектов.

Дополнительную информацию по текстурной фильтрации можно получить из следующих статей:

Еще раз повторю, что данная статья не будет затрагивать различия в билинейной и анизотропной фильтрации, а только особенности реализации трилинейной фильтрации.

Исключая незначительные, в данном случае, детали, трилинейная фильтрация зависит от двух вычисляемых значений: Rho (греческий символ "ро") из формулы (1) и Lamda (греческий символ "лямда") из формулы (2).

(1)

(2)

(3)


Вышеприведенные формулы взяты из спецификации OpenGL. Хотя видно, что Lamda напрямую зависит от Rho, все же в статье будут использоваться одновременно два этих значения, и из дальнейшего материала станет ясно почему. Rho называется "коэффициент масштаба" (scale factor), а Lamda — уровень детализации (level of detail — LOD).

Финальное значение цвета Tau вычисляется как линейная интерполяция между значениями цвета, выбранного из двух MIP уровней, а коэффициентом интерполяции является дробная часть Lamda (целая часть Lamda используется для определения из каких собственно MIP уровней выбирать значения цветов). Все что нам надо знать в данном материале о формуле (1), по которой определяется Rho, — это что результирующее значение зависит от площади текстуры, приходящейся на один пиксель финального изображения.

Изображения

Постоянные читатели уже неоднократно видели изображения, подобные вышеприведенному. Такие картинки получаются в результате рендеринга на 3D-ускорителе "бесконечного цилиндрического туннеля", стены которого раскрашены при помощи специально подготовленной текстуры. Особенность текстуры заключается в том, что каждый последующий ее MIP уровень закрашен в отличный от предыдущего цвет. В чем прелесть таких изображений? При одном взгляде на них можно определить, какой тип и степень фильтрации применяет 3D-ускоритель при различной степени увеличения/уменьшения текстур, изотропного/анизотропного наложения текстур, а также определить зависимость фильтрации от угла, под которым накладывается текстура. И все это можно было определить из одного изображения! Хм… По крайней мере, так это было до недавних пор.

Еще немного о том, как можно ориентироваться по данному изображению. Обычно пиксели, находящиеся на ее окружности, характеризуют фильтрацию, которая будет применена, если камера в нашем виртуальном туннеле повернется на 90 градусов и уставится в стену. Точка на окружности на "9 часов" будет соответствовать фильтрации, когда камера будет смотреть налево; точка на "12 часов" будет соответствовать фильтрации, при камере, глядящей наверх и т.д. Соответственно, точки находящиеся вблизи от центра картинки, соответствуют фильтрации, которая применяется к сильно удаленным и искаженным (вытянутым или наоборот сжатым) текстурам.

Форма лепестков, изображенных на картинке выше, зависит от метода, по которому рассчитывается Scale factor — Rho (см. формулу 1). В случае трилинейной фильтрации, цвета на картинке должны плавно переходить один в другой.

Ниже в статье будут приводиться аналогичные картинки с использованием несколько упрощенной текстуры — у нее все MIP уровни будут белыми, за исключением 2-ого по степени детализации, окрашенного в красный цвет. На такой текстуре видно, отлично видно, в каких местах будет использоваться данный MIP уровень, и как происходит трилинейная интерполяция между соседними MIP уровнями.

Все изображения и результаты получены про помощи разработанной в iXBT программы TextureFilteringTester, позволяющей исследовать качественные и скоростные характеристики алгоритмов текстурной фильтрации, выполняемых 3D ускорителями.

Итак, посмотрим какой вид принимает картинка, в случае высококачественной (не оптимизированной) трилинейной фильтрации на ATI R420 и NVIDIA NV40. Каждая картинка ниже является ссылкой на PNG изображение большего размера.

Normal trilinear

    
R420    NV40


Optimized trilinear

    
R420    NV40

Как были получены данные изображения? На NVIDIA NV40 для получения изображения не оптимизированной трилинейной фильтрации использовалось отключение оптимизации из панели управления.

ATI на данный момент использует более изощренную технику управления включением/выключением оптимизации трилинейной фильтрации. В момент загрузки текстуры драйвер видеокарты анализирует различия между MIP уровнями текстуры, и если он решает, что менее детальные MIP уровни не являются уменьшенной копией предыдущих, то оптимизация трилинейной фильтрации отключается, и для данной текстуры используется стандартный метод фильтрации. Поэтому для получения изображений с оптимизированной трилинейной фильтрацией, драйвер был обманут специальным образом модифицированной текстурой. В ходе экспериментов с различными текстурами выяснилось, что ATI включает оптимизация трилинейной фильтрации только для определенных классов текстур — в зависимости от их описания приложением. Например, в DirectX текстуры могут быть одного из трех классов: статические, динамические или управляемые (static, dynamic, managed). И оптимизированная трилинейная фильтрация в текущей версии драйвера включается только для управляемых (managed) текстур.

Какой непосредственный вывод можно сделать из сравнения вышеприведенных изображений (напоминаю, что в данной статье я обращаю внимание только на трилинейную фильтрацию)? "На глазок" у обоих чипов при включении оптимизированной трилинейной фильтрации полностью белые и полностью красные области увеличиваются примерно одинаково. Также видно, что на картинках у R420 наблюдается "полосатость" (banding) изображения, тогда как на NV40 цветовой переход исключительно плавный.

Чтобы жизнь медом не казалась, приведем картинку полученную на референсном растеризаторе (reference rasterizer) RefRast, входящем в состав DirectX SDK.

RefRast trilinear

Если присмотреться, то видно, что изображение, полученное на RefRast, совпадает с изображением, полученным на R420 в режиме с отключенной оптимизацией фильтрации. Чтобы не быть голословным ниже, приведено изображение, содержащее попиксельные различия между стандартной и оптимизированной фильтрацией на R420 и NV40, а также разницу между изображениями RefRast и R420. Для удобства читателей, после попиксельного сравнения, все три изображения были склеены в одну большею картинку, и в Photoshop была выполнения операция "Auto Levels". В результате, различия между типами фильтрации видны невооруженным взглядом, и в то же время можно сравнивать между собой поведение различных чипов. Первым выводом является то, что изменения в трилинейной фильтрации на всех чипах не зависят от угла, под которым накладывается текстура. Другим очевидным выводом является почти полная идентичность выполняемой фильтрации между R420 и RefRast.

R420 / NV40 / R420-normal vs RefRast

На этом я заканчиваю часть статьи с картинками и перехожу к числам.

Числа и графики

В этой главе я продемонстрирую, как производится трилинейная фильтрация, и с какой скоростью она выполняется на участке, выделенном зеленым цветом на рисунке ниже. На этом участке (слева направо) уровень детализации (LOD) и значение Lamda изменяется от 1 до 2. Т.е. в самой левой точке при фильтрации должен использоваться только 1-ый MIP уровень, справа — только 2-ой MIP уровень, а в промежутке — их линейная комбинация.

Посмотрим, что происходит на самом деле. Ниже приведены четыре графика построенные по экспериментальным данным по два на каждый из чипов R420 и NV40. Один из графиков показывает зависимость применяемого коэффициента трилинейной интерполяции от Rho, а другой от Lamda (смотри формулы и описание в начале статьи). На каждом из графиков присутствуют две кривые для стандартной трилинейной фильтрации и для оптимизированной.




И в довесок график для DirectX RefRast:

Итак, можно сделать разъяснения, зачем понадобилось делать по два графика для каждого из чипов. Если присмотреться, то видно, что линейная интерполяция проводится чипами ATI и NVIDIA на основе разных переменных. ATI использует для линейной интерполяции Rho, а NVIDIA Lamda. Это становится очевидно, если посмотреть в какой точке коэффициент интерполяции равен 1/2. Для ATI этот коэффициент становится равным 1/2 при Rho = 1.5, а для NVIDIA при Lamda = 0.5. Также видно, что чип ATI в не оптимизированном режиме выполняет трилинейную интерполяцию аналогично DirectX RefRast, ниже я еще к этому вернусь.

Перейдем к рассмотрению полученных графиков.

  • Очевидно, что NVIDIA в стандартном (не оптимизированном) режиме выполняет трилинейную фильтрацию идеально близко к спецификации OpenGL (по крайней мере, для 32 битных текстур).
  • ATI в стандартном режиме использует большие весовые коэффициенты для более детализированного MIP-уровня.
  • NVIDIA при использовании оптимизированной трилинейной фильтрации использует только билинейную фильтрацию в диапазоне ±0.16 от целого значения Lamda (LOD).
  • ATI при использовании оптимизированной трилинейной фильтрации, использует участок с билинейной фильтрацией составляюет приблизительно 30% от всего диапазона, и эта зона смещена в сторону использования более детализированных MIP-уровней.

На основе этих утверждений можно сделать следующие промежуточные выводы: (a) процентное соотношение участков, на которых и ATI и NVIDIA при "оптимизации" используют только билинейную фильтрацию, практически одинаково; (b) и при стандартной трилинейной фильтрации и при оптимизированной на скриншотах, изображения, полученные на чипах ATI, будут выглядеть иногда более четкими, а изображения, полученные на чипах NVIDIA, — более размытыми, но при движении камеры видео, получаемое на чипах ATI, будет более склонно к появлению муара и "песочка" (dithering), возникающих из-за недостаточной фильтрации (under-filtering).

Теперь вернемся назад к рассмотрению графиков, полученных на R420 и RefRast. Мы можем отметить два момента: ступенчатое поведение графика и линейную зависимость коэффициента интерполяции от Rho, a не от Lamda как рекомендует спецификация OpenGL (и DirectX — см. ниже).

Ступенчатая форма графика получается из того факта, что DirectX требует только 5 битной точности для коэффициента интерполяции. Как я уже упоминал выше, этот момент впервые затронули наши коллеги из 3DCenter.org. И хотя лично мне хотелось бы чтобы трилинейная интерполяция выполнялась с большей точностью — спецификации DirectX этого не требуют, и вендоры вольны находиться в рамках спецификаций.

Рассмотрим второй момент — нелинейную зависимость коэффициента трилинейной интерполяции от Lamda. Что за этим скрыватеся? Дело в том что операция вычисления логарифма от числа является трудоемкой и требует выделения модуль, выполняющий ее достаточно много транзисторов. И в качестве очередной оптимизации используется приближенное вычисление:



если "x" целое число > 1
и y < 2

Тогда x можно вычленить из экспоненты Rho, а у является мантиссой Rho. Именно такая оптимизация применяется, как в RefRast, так и в чипах ATI.

И напоследок — сладенькое: графики изменения скорости выполнения трилинейной фильтрации в зависимости от уровня детализации текстур (LOD). Естественно для оптимизированных и стандартных режимов фильтрации. Предупреждение: масштабы по оси Y для разных чипов разные.

Эти графики наглядно показывают, зачем ATI и NVIDIA понадобилось вводить оптимизации трилинейной фильтрации. По-моему дальнейшие комментарии после этих графиков излишни.

Заключение

Я не буду углубляться в анализ качества трилинейной фильтрации, тем более что в данной ситуации это величина субъективная. Но спецификации, описывающие оптимальные алгоритмы выполнения фильтрации, пока никто не менял, а производители видеочипов не в состоянии предусмотреть все варианты использования их детищ. И чем более производительными становятся видеочипы — тем больше желающих использовать их не для рендеринга 3D графики, а в качестве сопроцессора для произвольных вычислений. И в этой области строгое следование спецификации — скорее требование, чем пожелание.

Но вернемся к реальности — к тому, что данные ускорители в своем большинстве будут использоваться исключительно для 3D игр.
В этом случае:

  • использование оптимизированной трилинейной фильтрации достаточно сильно поднимает скорость выполнения фильтрации;
  • выигрыш при использовании оптимизированной трилинейной фильтрации примерно одинаков у обоих производителей;
  • на скриншотах изображения, полученные на чипах ATI, будет будут выглядеть иногда более четкими, а изображения, полученные на чипах NVIDIA, — более размытыми. Но при движении камеры видео, получаемое на чипах ATI, будет более склонно к появлению муара и "песочка" (dithering), возникающих из-за недостаточной фильтрации (under-filtering);
  • NVIDIA на текущих драйверах для NV40 позволяет пользователю глобально включать или отключать оптимизацию;
  • ATI не дает пользователю возможности выбора, драйвер сам решает включать или нет оптимизацию. Для определенных классов текстур текущая версия драйвера не использует оптимизации никогда, для остальных оптимизация включается, когда драйвер считает, что менее детальные MIP уровни являются уменьшенной копией предыдущих MIP уровней.

Мы с удовольствием предлагаем читателям самостоятельно оценить наличие оптимизаций у R420/RV3xx с помощью нашей утилиты:

Обратите внимание на правую сторону картинки — там как раз видна разница между полноценной трилинейкой и оптимизированной. Скачать программу можно по этой ссылке (850K). Также можно скачать набор (1,2MB) текстур, которые можно использовать вместо установленной по умолчанию, достаточно лишь переименовать их в test.png.

Разумеется, компания ATI вправе изменить алгоритмы оптимизаций, поэтому мы гарантируем корректную работу этой программы только совместно с драйверами CATALYST 4.5.




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.