Выборка в ближайшей точке

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

Используйте выборку в ближайшей точке аккуратно, поскольку иногда она может образовать графические артефакты при получении выборки из текстуры на границе между двумя текселями. Эта граница представляет собой расположение вдоль одной из осей текстуры (u или v), в котором используемый тексель переходит от одного текселя к другому. При выборке в точке система выбирает один или другой тексель, и результат на разных текселях может резко отличаться, поскольку пересекается граница. Это может проявиться как нежелательные графические артефакты в отображаемой текстуре. Если используется линейная фильтрация, полученный тексель вычисляется на основании обоих соседних текселей, и он плавно переходит между ними, поскольку индекс текселя пересекает границу.

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

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

иллюстрация прямоугольника из шести сегментов с разрывами в горизонтальных линиях в двух правых верхних квадратах

Два правых верхних квадрата отличаются от соседних тем, что в них заметно смещение по диагонали. Во избежание появления таких графических артефактов необходимо понимать правила выборки текстур в Direct3D при фильтрации по ближайшей точке. Direct3D сопоставляет координату текстуры с плавающей запятой в диапазоне от [0,0, 1,0] (от 0,0 до 1,0 включительно) до целочисленного значения пространства текселей в диапазоне от [ - 0,5, n - 0,5], где n — количество текселей в заданном измерении текстуры. Полученный индекс текстуры округляется до ближайшего целого числа. Данное сопоставление может привести к неточности выборки на границах текселей.

Простой пример: представим себе приложение, которое отрисовывает многоугольники с режимом адресации текстуры Wrap. Используя такое применяемое Direct3D сопоставление, индекс текстуры u сопоставляется, как показано на следующей схеме для текстуры с шириной 4 текселя.

схема координат текстуры 0,0 и 1,0 на границе между текселями

Координаты текстуры 0,0 и 1,0 на этой иллюстрации находятся точно на границе между текселями. С помощью метода, с помощью которого Direct3D сопоставляет значения, координаты текстуры варьируются от [ - 0,5, 4 до 0,5], где 4 — это ширина текстуры. В этом случае полученный при выборке тексель является текселем 0 для индекса текстуры 1,0. Однако, если координата текстуры будет немного меньше 1,0, полученный при выборке тексель будет текселем n, а не текселем 0.

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

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

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

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

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