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


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

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

Примере

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

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

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

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

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

Проще всего просто вернуть цвет ближайшего текселя с помощью пипетки; это называется точечной фильтрацией (см. раздел Выборка с ближайших точек), однако использовать ее не рекомендуется из-за зернистости и неточности результатов. Точечная выборка нашей текстуры в точке 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 с выполненной в каждом адресе текстуры билинейной фильтрацией

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