Поделиться через


Билинейная фильтрация текстур (Direct3D 9)

Текстуры всегда линейно адресуются от (0.0, 0.0) в левом верхнем углу до (1.0, 1.0) в правом нижнем углу, как показано на следующем рисунке.

Иллюстрация текстуры 4x4 со сплошными блоками цвета

Обычно текстуры представляются как состоящие из сплошных блоков цвета, однако правильнее воспринимать текстуры так же, как растровые дисплеи: каждый тексель определяется точно по центру ячейки сетки, как показано на следующем рисунке.

Иллюстрация текстуры 4x4 с текселями, определенными в центре ячеек сетки

Если запросить у инструмента "пипетка" UV-координаты этого цвета текстуры (0,375, 0,375), вы получите однотонный красный (255, 0, 0). Это имеет смысл, потому что точный центр красной ячейки текселя находится в УФ (0,375, 0,375). А что если с помощью пипетки определить цвет текстуры на UV (0,25, 0,25)? Это не так просто, потому что точка на УФ (0,25, 0,25) лежит на точном углу 4 текселей.

Простейшая схема заключается в том, чтобы пробоотборщик возвращал цвет ближайшего текселя; Это называется фильтрацией точек (см. раздел Выборка ближайших точек (Direct3D 9)) и обычно нежелательно из-за зернистых или блочных результатов. Точечная выборка нашей текстуры в точке UV (0,25, 0,25) показывает еще одну скрытую проблему с фильтрацией по ближайшим точкам: в этой точке четыре равноудаленных от точки выборки текселя, поэтому выбрать один ближайший тексель невозможно. Один из этих четырех текселей будет выбран в качестве возвращенного цвета, однако выбор зависит от округления координаты, а это, в свою очередь, может привести к разрывам артефактов (см. статью "Выборка с ближайших точек" в SDK).

Более точной и распространенной схемой фильтрации является вычисление средневзвешенный показатель из 4 текселей, наиболее близких к точке выборки; Это называется билинейной фильтрацией, и дополнительные затраты на вычисления обычно незначительны, так как эта процедура реализована в современном графическом оборудовании. Вот какие цвета мы получим в разных точках выборки, используя билинейную фильтрацию:

UV: (0.5, 0.5)

Эта точка находится точно на границе между красным, зеленым, синим и белым текселями. Инструмент "пипетка" возвращает серый цвет:

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

Эта точка находится в середине границы между красным и зеленым текселями. Пипетка возвращает желто-серый цвет (обратите внимание, что влияние синего и белого текселей равно 0):

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

это адрес красного текселя, возвращенного цвета (все остальные тексели в вычислении фильтрации имеют нулевой вес):

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

Сравните эти вычисления на следующем рисунке, который показывает, что произойдет, если вычисление билинейной фильтрации выполняется в каждом адресе текстуры 4x4.

иллюстрация текстуры 4x4 с выполненной в каждом адресе текстуры билинейной фильтрацией

Фильтрация текстур