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


Фильтрация билинейной текстуры

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

Пример

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

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

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

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

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

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

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

  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 с двулинейной фильтрацией, выполняемой по каждому адресу текстуры

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