Введение
Метод, используемый для определения цвета текстуры для пикселя с наложенной текстурой в компьютерной графике. В компьютерной графике фильтрация текстуры или сглаживание текстуры – это метод определения цвета текстуры для пикселя с наложенной текстурой, использующий цвета соседних текселей (то есть пикселей текстуры). Фильтрация описывает, как текстура применяется при различных формах, размерах, углах и масштабах. В зависимости от выбранного алгоритма фильтрации результат будет демонстрировать разную степень размытости, детализации, пространственного и временного алиасинга, а также блочности. В зависимости от обстоятельств, фильтрация может выполняться программно (например, в программном пакете рендеринга) или аппаратно, например, с использованием схем рендеринга в реальном времени или с ускорением на графическом процессоре (GPU), либо в их комбинации. Для большинства распространенных интерактивных графических приложений современная фильтрация текстуры выполняется специализированным оборудованием, которое оптимизирует доступ к памяти посредством кэширования и предварительной выборки, а также реализует выбор алгоритмов, доступных пользователю и разработчику. Существуют две основные категории фильтрации текстуры: фильтрация при увеличении и фильтрация при уменьшении. Она также крайне важна для когерентности кэша, поскольку без нее схема доступа к памяти при выборке из удаленных текстур будет демонстрировать крайне низкую локальность, что негативно скажется на производительности, даже если фильтрация не выполняется. При увеличении текстуры количество текселей, которые необходимо просмотреть для каждого пикселя, всегда составляет четыре или меньше; при уменьшении, однако, по мере удаления текстурированного полигона потенциально вся текстура может попасть в один пиксель. Это потребовало бы чтения всех текселей и объединения их значений для правильного определения цвета пикселя, что является чрезмерно дорогостоящей операцией. Mipmapping позволяет избежать этого, предварительно фильтруя текстуру и сохраняя ее в уменьшенных размерах до одного пикселя. По мере удаления текстурированной поверхности применяемая текстура переключается на предварительно отфильтрованный меньший размер. Различные размеры mip-карты называются «уровнями», где уровень 0 – самый большой (используется ближе всего к зрителю), а более высокие уровни используются на больших расстояниях.
In computer graphics, texture filtering or texture smoothing is the method used to determine the texture color for a texture mapped pixel, using the colors of nearby texels (ie. pixels of the texture). Filtering describes how a texture is applied at many different shapes, size, angles and scales. Depending on the chosen filter algorithm, the result will show varying degrees of blurriness, detail, spatial aliasing, temporal aliasing and blocking. Depending on the circumstances, filtering can be performed in software (such as a software rendering package) or in hardware, eg. with either real time or GPU accelerated rendering circuits, or in a mixture of both. For most common interactive graphical applications, modern texture filtering is performed by dedicated hardware which optimizes memory access through memory cacheing and pre fetch, and implements a selection of algorithms available to the user and developer. There are two main categories of texture filtering: magnification filtering and minification filtering. It is also highly beneficial for cache coherency without it the memory access pattern during sampling from distant textures will exhibit extremely poor locality, adversely affecting performance even if no filtering is performed. During texture magnification, the number of texels that need to be looked up for any pixel is always four or fewer; during minification, however, as the textured polygon moves farther away potentially the entire texture might fall into a single pixel. This would necessitate reading all of its texels and combining their values to correctly determine the pixel color, a prohibitively expensive operation. Mipmapping avoids this by prefiltering the texture and storing it in smaller sizes down to a single pixel. As the textured surface moves farther away, the texture being applied switches to the prefiltered smaller size. Different sizes of the mipmap are referred to as 'levels', with Level 0 being the largest size (used closest to the viewer), and increasing levels used at increasing distances.
Методы фильтрации
В этом разделе перечислены наиболее распространенные методы фильтрации текстур в порядке возрастания вычислительной сложности и качества изображения.
Интерполяция ближайшего соседа
Интерполяция ближайшего соседа — самый простой и грубый метод фильтрации: он просто использует цвет текселя, ближайшего к центру пикселя, для определения цвета пикселя. Несмотря на простоту, это приводит к большому количеству артефактов — текстура выглядит блочной при увеличении, а при уменьшении возникают алиасинг и мерцание. Этот метод быстр при увеличении, но при уменьшении шаг доступа к памяти становится произвольно большим, и он часто может быть менее эффективным, чем использование MIP-карт из-за отсутствия пространственной связности при доступе к текстуре и повторного использования кэша.
Ближайший сосед с мип-картой
Этот метод по-прежнему использует интерполяцию ближайшего соседа, но добавляет mipmapping — сначала выбирается ближайший уровень mipmap в зависимости от расстояния, затем производится выборка ближайшего центра текселя для получения цвета пикселя. Это значительно снижает алиасинг и мерцание при уменьшении, но не устраняет их полностью. Это также улучшает доступ к текстурной памяти и повторное использование кэш-линий, предотвращая произвольно большие шаги доступа к текстурной памяти во время растрирования. Однако это не решает проблему блочности при увеличении, поскольку каждый увеличенный тексель по-прежнему будет выглядеть как большой прямоугольник.
Линейная фильтрация мип-карты
Менее распространенные API, такие как OpenGL, поддерживают выборку ближайшего соседа из отдельных уровней детализации (mipmap), при этом линейно интерполируя два ближайших уровня детализации, релевантных для данной точки выборки.
Билинейное фильтрование
При билинейной фильтрации производится выборка четырех ближайших к центру пикселя текселей (на ближайшем уровне MIP-карты), а их цвета объединяются с помощью взвешенного среднего, пропорционального расстоянию. Это устраняет "блочность", заметную при увеличении, поскольку теперь между текселями наблюдается плавный градиент изменения цвета, а не резкий скачок при пересечении центром пикселя границы текселя. Билинейная фильтрация часто используется для увеличения изображения. При уменьшении масштаба она обычно применяется вместе с MIP-картами; хотя её можно использовать и без них, в этом случае она будет страдать от тех же проблем с алиасингом и мерцанием, что и фильтрация ближайшего соседа при сильном уменьшении. Однако при умеренных коэффициентах уменьшения её можно использовать как недорогой, аппаратно ускоренный метод взвешенной суперобразцовки текстур. Nintendo 64 использовала необычную версию билинейной фильтрации, в которой для оптимизации аппаратной части использовались только три пикселя вместо четырех. Это приводит к заметному "смещению в виде треугольников" в некоторых текстурах.
Трилинейная фильтрация
Трилинейная фильтрация — это способ устранить распространенный артефакт, возникающий в изображениях с мипмаппированием и билинейной фильтрацией: резкое и заметное изменение качества на границах, где рендерер переходит с одного уровня мипмап на другой. Трилинейная фильтрация решает эту проблему, выполняя поиск текстуры и билинейную фильтрацию на двух ближайших уровнях мипмап (на одном более высоком и одном более низком по качеству), а затем линейно интерполируя полученные результаты. Это обеспечивает плавное снижение качества текстуры с увеличением расстояния до зрителя, а не серию резких переходов. Естественно, на расстоянии ближе, чем уровень 0, доступен только один уровень мипмап, и алгоритм возвращается к билинейной фильтрации.
Анизотропная фильтрация
Анизотропная фильтрация – это фильтрация наивысшего качества, доступная в современных потребительских 3D-графических картах. Более простые "изотропные" методы используют только квадратные мип-карты, которые затем интерполируются с помощью би- или трилинейной фильтрации. (Изотропный означает одинаковый во всех направлениях и поэтому используется для описания системы, в которой все карты являются квадратами, а не прямоугольниками или другими четырехугольниками.) Когда поверхность находится под большим углом к камере, область заполнения текстурой не будет приблизительно квадратной. Рассмотрим типичный пример – пол в игре: область заполнения значительно шире, чем выше. В этом случае ни одна из квадратных карт не подходит должным образом. Это приводит к размытости и/или мерцанию, в зависимости от способа выбора соответствия. Анизотропная фильтрация устраняет эту проблему, выполняя выборку текстуры в форме, отличной от квадрата. Цель состоит в том, чтобы выполнить выборку текстуры, соответствующую отпечатку пикселя при его проецировании в пространство текстур, а такой отпечаток не всегда выровнен по осям текстуры. Более того, с точки зрения теории выборки, пиксель – это не маленький квадрат, следовательно, его отпечаток не будет представлять собой проекцию квадрата. Формирование отпечатков в пространстве текстур представляет собой некоторое приближение вычисленной функции проецируемого пикселя в пространстве текстур, но детали часто являются приблизительными, строго конфиденциальными и основаны на различных подходах к теории выборки. Концептуально, цель состоит в том, чтобы выполнить более точную анизотропную выборку с соответствующей ориентацией, чтобы избежать конфликта между алиасингом по одной оси и размытием по другой, когда спроецированный размер различается. В анизотропных реализациях фильтрация может включать те же алгоритмы фильтрации, которые используются для фильтрации квадратных карт традиционного мип-мэппинга при построении промежуточного или конечного результата.
Процент Фильтрация ближе
Картирование теней на основе глубины может использовать интересный фильтр с процентной близостью (PCF) с текстурами, содержащими карту глубины, что расширяет представление о типах текстурных фильтров, которые можно применить. В PCF карта глубины сцены рендерится из источника света. При последующем рендеринге сцены эта карта глубины проецируется обратно в сцену из позиции источника света, и выполняется сравнение между проективной координатой глубины и глубиной полученного образца текстуры. Проективная координата представляет собой глубину пикселя сцены от источника света, а глубина, полученная из карты глубины, представляет глубину сцены вдоль этого спроецированного направления. Таким образом, можно определить видимость источника света для пикселя и, следовательно, его освещенность. Эта операция текстурирования является булевым тестом на освещенность пикселя, однако для данного пикселя можно протестировать несколько образцов, а булевы результаты суммируются и усредняются. Таким образом, в сочетании с различными параметрами, такими как местоположение семплированного текселя и даже сдвинутое местоположение проекции карты глубины, можно вычислить среднее значение после сравнения глубины или процент образцов, которые ближе и, следовательно, освещены, для пикселя. Важно отметить, что суммирование булевых результатов и генерация процентного значения должны выполняться после сравнения проективной глубины и глубины семпла, поэтому это сравнение глубины становится неотъемлемой частью текстурного фильтра. Этот процент можно использовать для взвешивания вычисления освещенности и получения не только булевого значения освещенности или тени, но и мягкой полутени. Современное оборудование поддерживает версию этого метода, где выполняется сравнение и применяется билинейный фильтр по расстоянию после булевого сравнения.