Фильтрация текстур
В компьютерной графике фильтрация текстур или сглаживание текстур — это метод, используемый для определения цвета текстуры для , наложенного на текстуру пикселя , с использованием цветов соседних текселей (т. е. пикселей текстуры).
Фильтрация описывает, как применяется текстура различных форм, размеров, углов и масштабов. В зависимости от выбранного алгоритма фильтра результат будет показывать различную степень размытости, детализации, пространственного сглаживания , временного сглаживания и блокировки. В зависимости от обстоятельств фильтрация может выполняться программным обеспечением (например, пакетом программного рендеринга) или аппаратным обеспечением, например. либо с помощью схем рендеринга в реальном времени, либо с ускорением графического процессора , либо с использованием того и другого. Для большинства распространенных интерактивных графических приложений современная фильтрация текстур выполняется специальным оборудованием , которое оптимизирует доступ к памяти посредством кэширования памяти и предварительной выборки , а также реализует набор алгоритмов, доступных пользователю и разработчику.
Существует две основные категории фильтрации текстур: фильтрация увеличения и фильтрация минимизации. [1] В зависимости от ситуации фильтрация текстур представляет собой либо тип фильтра реконструкции , в котором разреженные данные интерполируются для заполнения пробелов (увеличение), либо тип сглаживания (AA), при котором образцы текстур существуют с более высокой частотой, чем требуется для частоты выборки. необходим для заливки текстуры (минификации).
Существует множество методов фильтрации текстур, которые позволяют найти компромисс между вычислительной сложностью, пропускной способностью памяти и качеством изображения.
Необходимость фильтрации [ править ]
В процессе наложения текстуры на любую произвольную трехмерную поверхность Поиск текстуры позволяет определить, где на текстуре находится центр каждого пикселя. Для полигональных поверхностей с текстурным отображением, состоящих из треугольников, типичных для большинства поверхностей в 3D-играх и фильмах, каждый пиксель (или подчиненный образец пикселя ) этой поверхности будет связан с некоторым треугольником(ами) и набором барицентрических координат , которые используются для обеспечить позицию внутри текстуры. Такое положение может не идеально лежать на «пиксельной сетке», что требует некоторой функции для учета этих случаев. Другими словами, поскольку текстурированная поверхность может находиться на произвольном расстоянии и в произвольной ориентации относительно зрителя, один пиксель обычно не соответствует непосредственно одному текселю. Чтобы определить лучший цвет для пикселя, необходимо применить некоторую форму фильтрации. Недостаточная или неправильная фильтрация будет отображаться на изображении в виде артефактов (ошибок изображения), таких как «блочность», неровности или мерцание.
Между пикселем и текселем/текселями, которые он представляет на экране, могут быть разные типы соответствия. Они зависят от положения текстурированной поверхности относительно зрителя, и в каждом случае необходимы разные формы фильтрации. Учитывая квадратную текстуру, нанесенную на квадратную поверхность мира, на некотором расстоянии просмотра размер одного пикселя экрана будет точно таким же, как один тексел. Более того, текселы больше, чем пиксели экрана, и их необходимо соответствующим образом масштабировать — процесс, известный как увеличение текстуры . Дальше каждый тексел меньше пикселя, поэтому один пиксель покрывает несколько текселей. В этом случае соответствующий цвет необходимо выбрать на основе покрытых текселей посредством минимизации текстуры . Графические API, такие как OpenGL, позволяют программисту устанавливать различные варианты фильтров уменьшения и увеличения. [1]
Обратите внимание, что даже в случае, когда пиксели и тексели имеют одинаковый размер, один пиксель не обязательно будет точно соответствовать одному текселю. Он может быть смещен или повернут и закрывать части до четырех соседних текселей. Следовательно, некоторая форма фильтрации по-прежнему требуется.
Мипмэппинг [ править ]
Мипмэппинг — это стандартный метод, используемый для экономии части работы по фильтрации, необходимой во время минимизации текстур. [2] Это также очень полезно для согласованности кэша — без него шаблон доступа к памяти во время выборки из удаленных текстур будет демонстрировать крайне плохую локальность, что отрицательно скажется на производительности, даже если фильтрация не выполняется.
Во время увеличения текстуры количество текселей, которые необходимо найти для каждого пикселя, всегда равно четырем или меньше; Однако во время минификации, когда текстурированный многоугольник отодвигается дальше, вся текстура может оказаться в одном пикселе. Это потребует чтения всех его текселей и объединения их значений для правильного определения цвета пикселя, а это непомерно дорогая операция. Мипмэппинг позволяет избежать этого, предварительно фильтруя текстуру и сохраняя ее в меньших размерах, вплоть до одного пикселя. По мере удаления текстурированной поверхности применяемая текстура переключается на предварительно отфильтрованный меньший размер. Различные размеры MIP-карты называются «уровнями», причем уровень 0 — это самый большой размер (используется ближе всего к зрителю), а увеличивающиеся уровни используются при увеличении расстояния.
Методы фильтрации [ править ]
В этом разделе перечислены наиболее распространенные методы фильтрации текстур в порядке возрастания вычислительных затрат и качества изображения.
Интерполяция ближайшего соседа [ править ]
Интерполяция ближайшего соседа — это самый простой и грубый метод фильтрации: он просто использует цвет текселя, ближайшего к центру пикселя, в качестве цвета пикселя. Несмотря на простоту, это приводит к большому количеству артефактов — «блочности» текстуры при увеличении, [3] а также сглаживание и мерцание во время минификации. [4] Этот метод работает быстро во время увеличения, но во время минимизации объем памяти становится сколь угодно большим, и он часто может быть менее эффективным, чем MIP-отображение, из-за отсутствия пространственно-когерентного доступа к текстурам и повторного использования строк кэша. [5]
Ближайший сосед с MIP-отображением [ править ]
Этот метод по-прежнему использует интерполяцию ближайшего соседа, но добавляет мип-маппинг — сначала выбирается ближайший уровень мип-карты в соответствии с расстоянием, затем отбирается ближайший центр текселя для получения цвета пикселя. Это значительно уменьшает алиасинг и мерцание во время минификации, но не устраняет их полностью. При этом улучшается доступ к памяти текстур и повторное использование строк кэша, избегая произвольно больших шагов доступа к памяти текстур во время растеризации. Это не помогает устранить блочность при увеличении, поскольку каждый увеличенный тексель по-прежнему будет выглядеть как большой прямоугольник.
Линейная фильтрация MIP-карт [ править ]
Реже используемые OpenGL и другие API поддерживают выборку ближайших соседей из отдельных MIP-карт при линейной интерполяции двух ближайших MIP-карт, соответствующих выборке.
Билинейная фильтрация [ править ]
При билинейной фильтрации выбираются четыре ближайших к центру пикселя текселя (на ближайшем уровне MIP-карты), а их цвета комбинируются по средневзвешенному значению в зависимости от расстояния. [6] Это устраняет «блочность», наблюдаемую при увеличении, поскольку теперь происходит плавный градиент изменения цвета от одного тексела к другому, а не резкий скачок, когда центр пикселя пересекает границу текселя. [7] Билинейная фильтрация для фильтрации увеличения является обычным явлением. При использовании для минимизации он часто используется с мип-мэппингом; хотя его можно использовать и без него, при слишком сильном минимизации он будет испытывать те же проблемы с псевдонимами и мерцанием, что и фильтрация ближайших соседей. Однако при скромных коэффициентах минификации его можно использовать в качестве недорогого суперсэмпла взвешенных текстур с аппаратным ускорением.
В Nintendo 64 использовалась необычная версия билинейной фильтрации, в которой используются только три пикселя вместо четырех из-за проблем с аппаратной оптимизацией. Это приводит к заметному «смещению триангуляции» в некоторых текстурах. [8]
Трилинейная фильтрация [ править ]
Трилинейная фильтрация — это средство устранения распространенного артефакта, наблюдаемого в изображениях с множественным отображением и билинейной фильтрацией: резкое и очень заметное изменение качества на границах, где средство рендеринга переключается с одного уровня мип-карты на другой. Трилинейная фильтрация решает эту проблему, выполняя поиск текстуры и билинейную фильтрацию на двух ближайших уровнях MIP-карт (один более высокого и один более низкого качества), а затем линейно интерполируя результаты. [9] Это приводит к плавному ухудшению качества текстур по мере увеличения расстояния от зрителя, а не к серии внезапных падений. Конечно, ближе к уровню 0 доступен только один уровень MIP-карт, и алгоритм возвращается к билинейной фильтрации.
Анизотропная фильтрация [ править ]
Анизотропная фильтрация — это фильтрация высочайшего качества, доступная в современных потребительских 3D- видеокартах . Более простые, «изотропные» методы используют только квадратные MIP-карты, которые затем интерполируются с использованием би- или трилинейной фильтрации. ( Изотропный означает один и тот же во всех направлениях и, следовательно, используется для описания системы, в которой все карты представляют собой квадраты, а не прямоугольники или другие четырехугольники.)
Когда поверхность находится под большим углом относительно камеры, область заливки текстуры не будет приблизительно квадратной. Рассмотрим обычный случай пола в игре: ширина заливки гораздо больше, чем высота. В этом случае ни одна из квадратных карт не подойдет. В результате получается размытость и/или мерцание, в зависимости от выбранной посадки. Анизотропная фильтрация исправляет это, сэмплируя текстуру неквадратной формы. Цель состоит в том, чтобы получить образец текстуры, соответствующий пиксельному отпечатку, проецируемому в пространство текстуры, и такой отпечаток не всегда выровнен по оси с текстурой. Кроме того, когда речь идет о теории выборки, пиксель — это не маленький квадрат. [10] поэтому его след не будет представлять собой проецируемый квадрат. Сборка посадочных мест в текстурном пространстве представляет собой некоторую аппроксимацию вычисленной функции проецируемого пикселя в текстурном пространстве, но детали часто являются приблизительными. [11] очень авторский и погряз во мнениях о теории выборки. Концептуально, однако, цель состоит в том, чтобы получить более правильный анизотропный образец соответствующей ориентации, чтобы избежать конфликта между сглаживанием на одной оси и размытием на другой, когда проецируемый размер различается.
В анизотропных реализациях фильтрация может включать в себя те же алгоритмы фильтрации, которые используются для фильтрации квадратных карт традиционного мип-мэппинга во время построения промежуточного или конечного результата.
Процентная фильтрация ближе [ править ]
на основе глубины Для картирования теней можно использовать интересный фильтр Percentage Closer Filter (PCF) с текстурами с отображением глубины, который расширяет представление о типах текстурных фильтров, которые могут быть применены. В PCF карта глубины сцены визуализируется от источника света. Во время последующего рендеринга сцены эта карта глубины затем проецируется обратно в сцену из положения источника света, и выполняется сравнение координаты проекционной глубины и глубины полученного образца текстуры. Проекционная координата будет глубиной пикселей сцены от источника света, но глубина, полученная из карты глубины, будет представлять глубину сцены в этом проецируемом направлении. Таким образом, для визуализированного пикселя можно определить видимость света и, следовательно, освещенность светом. Таким образом, эта операция текстурирования представляет собой логическую проверку того, горит ли пиксель, однако для данного пикселя можно протестировать несколько выборок, а логические результаты суммировать и усреднить. Таким образом, в сочетании с различными параметрами, такими как местоположение выборки текселей и даже местоположение проекции карты глубины с дрожанием, для пикселя можно вычислить среднее значение после сравнения глубины или процент более близких и, следовательно, освещенных образцов. Крайне важно, что суммирование логических результатов и генерация процентного значения должны выполняться после сравнения глубины проективной глубины и выборки выборки, поэтому это сравнение глубины становится неотъемлемой частью фильтра текстур. Этот процент затем можно использовать для взвешивания расчета освещенности и получения не просто логического значения освещенности или тени, но и результата мягкой полутени. [12] [13] Версия этого поддерживается в современном оборудовании, где выполняется сравнение и применяется билинейный фильтр после логического сравнения по расстоянию. [14]
См. также [ править ]
Ссылки [ править ]
- ^ Перейти обратно: а б «Глава 9 — Руководство по программированию OpenGL» . Glprogramming.com. 13 февраля 2009 г. Фильтрация . Проверено 14 января 2018 г.
- ^ Уильямс, Лэнс (1983). «Пирамидная параметрика» (PDF) . ACM SIGGRAPH Компьютерная графика . 17 (3): 1–11. дои : 10.1145/964967.801126 . ISSN 0097-8930 . Архивировано из оригинала (PDF) 6 июня 2016 г. Проверено 14 февраля 2017 г.
- ^ «Дизайн игрового движка: наложение текстур» (PDF) . uncc.edu. Увеличение текстуры. Архивировано из оригинала (PDF) 17 апреля 2021 г. Проверено 14 февраля 2017 г.
- ^ «Дизайн игрового движка: наложение текстур» (PDF) . uncc.edu. Минимизация текстур. Архивировано из оригинала (PDF) 17 апреля 2021 г. Проверено 14 февраля 2017 г.
- ^ Хендрик Ленш (29 ноября 2007 г.). «Компьютерная графика: теория фильтрации текстур и выборки» (PDF) . Общество Макса Планка . Мип-карты . Проверено 14 января 2018 г.
- ^ Маркус Хадвигер (09 марта 2015 г.). «Лекция 12 по программированию GPU и GPGPU: Текстурирование графического процессора 2» (PDF) . КАУСТ . Реконструкция текстуры: Увеличение. Архивировано из оригинала (PDF) 24 января 2021 г. Проверено 14 февраля 2017 г.
- ^ Маркус Хадвигер (09 марта 2015 г.). «Лекция 12 по программированию GPU и GPGPU: Текстурирование графического процессора 2» (PDF) . КАУСТ . Сглаживание текстур: MIP-маппинг. Архивировано из оригинала (PDF) 24 января 2021 г. Проверено 14 февраля 2017 г.
- ^ «Система видеоигр с сопроцессором, обеспечивающая высокоскоростную эффективную 3D-графику и обработку цифрового аудиосигнала» . Проверено 14 ноября 2022 г.
- ^ Хендрик Ленш (29 ноября 2007 г.). «Компьютерная графика: теория фильтрации текстур и выборки» (PDF) . Общество Макса Планка . Мипмэппинг II . Проверено 14 января 2018 г.
- ^ Элви Рэй Смит (17 июля 1995 г.). «Пиксель — это не маленький квадрат! (А воксель — это не маленький куб) — Техническая памятка 6» (PDF) . cs.princeton.edu . Проверено 14 января 2018 г.
- ^ Хендрик Ленш (29 ноября 2007 г.). «Компьютерная графика: теория фильтрации текстур и выборки» (PDF) . Общество Макса Планка . Анизотропная фильтрация . Проверено 14 января 2018 г.
- ^ Ривз, Уильям Т.; Салезин, Дэвид Х.; Кук, Роберт Л. (1 августа 1987 г.). «Рендеринг сглаженных теней с помощью карт глубины» (PDF) . ACM SIGGRAPH Компьютерная графика . 21 (4). Ассоциация вычислительной техники (ACM): 283–291. дои : 10.1145/37402.37435 . ISSN 0097-8930 . S2CID 18320563 . Архивировано из оригинала (PDF) 15 января 2018 г.
- ^ Рандима Фернандо (2 июля 2008 г.). «Мягкие тени на процент ближе» (PDF) . Корпорация NVIDIA . Проверено 14 января 2018 г.
- ^ «WebGL WEBGL_length_texture Спецификация расширения, утвержденная Khronos» . Хронос.орг. 15 июля 2014 г. Проверено 14 января 2018 г.