Всего на сайте:
282 тыс. 988 статей

Главная | Информатика

Анизотропная фильтрация  Просмотрен 62

Фильтрация текстур: основная идея

Чтобы понять разницу между различными алгоритмами фильтрации нужно сначала понять, что пытается сделать фильтрация. Ваш экран имеет определенное разрешение и состоит из того, что называется пикселями. Разрешение определяется количеством пикселей. Ваша 3D плата должна определить цвет каждого из этих пикселей. Основой для определения цвета пикселей служат текстурные изображения, которые накладываются на полигоны, расположенные в трехмерном пространстве. Текстурные изображения состоят из пикселей, называемых текселями. По сути, эти тексели являются пикселями 2D изображения, которые наложены на 3D поверхность. Главный вопрос таков: какой тексель (или какие тексели) определяет цвет пикселя на экране?

Представьте себе следующую проблему: предположим, что ваш экран это плита с большим количеством отверстий (давайте исходить из предположения, что пиксели имеют круглую форму). Каждое отверстие это пиксель. Если вы посмотрите через отверстие, вы увидите какой цвет оно имеет, соотносительно трехмерной сцены, раполагающейся за плитой. Теперь представьте себе световой луч, проходящий через одно из этих отверстий и попадающий на текстурированный полигон, расположенный за ним. Если полигон расположен параллельно экрану (т.е. нашей воображаемой плите с отверстиями), тогда световой луч попав на него образует круглое световой пятно (см. рис. 1). Теперь, вновь подключив воображение, заставим полигон вращаться вокруг своей оси и самые простые познания подскажут вам, что форма светового пятна изменится, и вместо круглой станет эллиптической (см. рис. 2 и 3). Вы, вероятно, желаете знать, какое отношение имеет это пятно света к проблеме определения цвета пикселя. Элементарно, все полигоны, расположенные в этом пятне света определяют цвет пикселя. Все, что мы тут обсудили и есть основные знания, которые необходимо знать для того, что бы понять различные алгоритмы фильтрации.


Антиалиасинг Основные понятия

3D-ускоритель работает с примитивами: треугольниками и линиями - в своей основе эти примитивы являются непрерывными объектами, и лишь при растеризации превращаются в пикселы. Этот процесс называется сэмплингом, и ему присущ артефакт под названием алиасинг. При сэмплинге цвет пиксела определяется цветом полигона, которому принадлежит центр пиксела. Примеры алиасинга:

· Лестничный эффект (Stairstep or "jaggies")

· Потеря мелких деталей

· Муар (Moire Patterns), разрушение текстур (Texture disintegration)

· Временной алиасинг: мерцание объектов, вращение колеса в другую сторону, анимация лестничного эффекта

Для решения проблемы алиасинга предназначен антиалиасинг. Антиалиасинг делится на две категории - пространственный (spatial) и временной (temporal).

Пространственный антиалиасинг бывает двух видов:

· Суперсэмплинг (supersampling), или полный антиалиасинг (full-scene antialiasing)

· Полигональная фильтрация (polygon filtering), или краевой антиалиасинг (edge antialiasing)

Полный антиалиасинг

Суперсэмплинг - наиболее популярный метод, применяемый в 3D-ускорителях (прежде всего из-за своей простоты). Каждый пиксел состоит из субпикселов, для каждого вычисляется цвет, а затем усреднением получается цвет пиксела. Конкретное представление пиксела называется субпиксельной маской (к примеру 2x2, 4x4). Чем больше субпикселов отводится на каждый пиксел, тем качественнее получается антиалиасинг. Маска 4x4 считается оптимальной с точки зрения качества, но при этом скорость заполнения снижается в 16 раз. С другой стороны, более простая маска обеспечивает более высокую скорость, но и менее качественное изображение. В любом случае суперсэмплинг снижает алиасинг, но кардинально не решает проблему.

Теоретически при суперсэмплинге субпиксельная маска может быть любой (к примеру при стохастическом суперсэмплинге субпикселы расположены в псевдо-случайном порядке). В 3D-ускорителях применяется регулярная маска размером от 2x1 до 4x4. Окончательный цвет пиксела вычисляется усреднением либо на основе весов, либо без них. К примеру для маски 3x3 центральный субпиксел должен иметь больший вес, чем угловые субпикселы, поэтому усреднение на основе весов имеет лучший результат.

Существует несколько реализаций суперсэмплинга:

· Выполняется рендеринг в большем разрешении, затем выполняется масштабирование до реального разрешения. Например при разрешении 800x600 и субпиксельной маске 2x2 рендеринг выполняется при виртуальном разрешении 1600x1200. Это требует вчетверо большего объема памяти. Эта методика стала стандартной в игровых 3D-ускорителях.

· Фреймбуфер делится на фрагменты (tiles). Каждый фрагмент рендерится в большем разрешении, соответствующему субпиксельной маске, а затем масштабируется до меньшего разрешения.

· Рендеринг выполняется в несколько проходов (для маски 2x2 - в 4 прохода). Каждый раз все координаты смещаются на некоторую дельту. Промежуточный результат хранится в буфере-акумуляторе, и результат каждого прохода суммируется с ним. Преимущество метода - нетребовательность к объему памяти (даже для маски 4x4 требуется объем памяти, как при обычном рендеринге без антиалиасинга). Метод применялся в некоторых профессиональных OpenGL-ускорителях.

Предыдущая статья:Простая модель изображения 3D объекта в виде каркаса. Следующая статья:Краевой антиалиаиснг
page speed (0.0161 sec, direct)