Фильтрование текстур

Если текстурированная грань находится достаточно далеко от наблюдателя, тогда на один пиксел экрана приходится много текселов текстуры. При использовании обычного алгоритма наложения текстур выбирается лишь один из этих текселов, фактически его выбор происходит случайным образом. Поэтому при небольших смещениях наблюдателя появляется мельтешение пикселей на экране. На самом деле нужно брать среднее значение всех текселей, попавших в пиксел это называется анизотропным фильтрованием, но это требует достаточной вычислительной мощности.

Более простым методом является пирамидальное фильтрование (mipmapping), для этого строится иерархия текстур, текстура на очередном уровне два раза меньше предыдущей. Для этого выбираются квадраты 2х2 тексела и значение цвета в них усредняется. 8х8->4х4->2х2->1х1. Дополнительные затраты памяти составляют 33% от начального размер текстуры.

Если одному пикселу на экране соответствует k текселов исходной текстуры вдоль одной из текстурных координат (u,v), тогда выбирается уровень i для которого . Коэффициент k можно выбирать один для всей текстуры, например посчитав средний шаг вдоль одного из ребер , или для каждого спана, можно – участка спана. Чем чаще считать – тем лучше, т.к. k-неравномерно распределен по полигону.

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

С0=С00+(С01-С00)*ku

С1=С10+(С11-С10)*ku

С= С0+(С1-С0) *kv

U0=floor(U-0.5) V0=floor(V-0.5)

ku=U-(U0+0.5) kv=V-(V0+0.5)

Наиболее правильной будет трилинейная фильтрация, когда цвет дополнительно интерполируется между соседними уровнями иерархии текстур.

Лекция 14


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: