Чтобы понять природу анизотропной фильтрации, необходимо четко понимать, что в действительности означает наложение текстуры.
Термин «наложение текстуры» означает назначение позиций на объекте местоположениям в текстуре. Это позволяет растеризатору / шейдеру для каждой позиции на объекте извлекать соответствующие данные из текстуры. Традиционный метод для этого - назначить каждой вершине объекта текстурную координату, которая напрямую отображает эту позицию в местоположение в текстуре. Растеризатор будет интерполировать эту текстурную координату по граням различных треугольников, чтобы получить текстурную координату, используемую для извлечения цвета из текстуры.
Теперь давайте подумаем о процессе растеризации. Как это работает? Он берет треугольник и разбивает его на блоки размером с пиксель, которые мы будем называть «фрагментами». Теперь эти блоки размером в пиксель имеют размер в пикселях относительно экрана.
Но эти фрагменты имеют размер не в пикселях относительно текстуры. Представьте, что наш растеризатор сгенерировал координату текстуры для каждого угла фрагмента. Теперь представьте, что рисуете эти 4 угла не в пространстве экрана, а в пространстве текстур . Какая это будет форма?
Ну, это зависит от координат текстуры. То есть это зависит от того, как текстура сопоставлена с полигоном. Для любого конкретного фрагмента это может быть выровненный по оси квадрат. Это может быть не выровненный по оси квадрат. Это может быть прямоугольник. Это может быть трапеция. Это может быть почти любая четырехсторонняя фигура (или, по крайней мере, выпуклая фигура ).
Если вы правильно выполняли доступ к текстуре, способ получить цвет текстуры для фрагмента - выяснить, что это за прямоугольник. Затем извлеките каждый тексель из текстуры внутри этого прямоугольника (используя покрытие для масштабирования цветов, находящихся на границе). Затем усредните их все вместе. Это было бы идеальное наложение текстуры.
Это также будет очень медленно .
В интересах производительности, мы вместо этого пытаемся приблизить реальный ответ. Мы основываем вещи на одной текстурной координате, а не на 4, которые покрывают всю область фрагмента в пространстве текселей.
Фильтрация на основе MipMap использует изображения с более низким разрешением. Эти изображения в основном являются ярлыком для идеального метода, предварительно вычисляя, как будут выглядеть большие блоки цветов при смешивании. Поэтому, когда он выбирает более низкую карту, он использует предварительно вычисленные значения, где каждый тексель представляет область текстуры.
Анизотропная фильтрация работает путем аппроксимации идеального метода (который может и должен сочетаться с mipmapping) путем отбора фиксированного числа дополнительных образцов. Но как он вычисляет область в пространстве текселей для выборки, поскольку ей все еще дается только одна координата текстуры?
В основном это обманывает. Поскольку фрагментные шейдеры выполняются в соседних блоках 2x2, можно вычислить производную любого значения в фрагментном шейдере в экранном пространстве X и Y. Затем он использует эти производные в сочетании с фактической координатой текстуры, чтобы вычислить приближение какой будет фактический след текстуры фрагмента. И затем он выполняет ряд образцов в этой области.
Вот диаграмма, чтобы помочь объяснить это:
Черно-белые квадраты представляют нашу текстуру. Это просто шахматная доска из 2х2 белого и черного текселей.
Оранжевая точка - это координата текстуры для рассматриваемого фрагмента. Красный контур - это фрагмент фрагмента, который центрирован по координате текстуры.
Зеленые прямоугольники представляют тексели, к которым может обращаться реализация анизотропной фильтрации (детали алгоритмов анизотропной фильтрации зависят от платформы, поэтому я могу объяснить только общую идею).
Эта конкретная диаграмма предполагает, что реализация может получить доступ к 4 текселям. О, да, зеленые ящики покрывают 7 из них, но зеленая коробка в центре может быть получена из меньшего mipmap, таким образом, выбирая эквивалент 4 текселей за один выбор. Реализация, конечно, будет взвешивать среднее значение для этой выборки на 4 по сравнению с единичными текселями.
Если предел анизотропной фильтрации был 2, а не 4 (или выше), то реализация выбрала бы 2 из этих выборок, чтобы представить отпечаток фрагмента.