Поделиться через


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

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

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

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

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

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

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

Например, представьте себе приложение, которое отрисовывает многоугольники с помощью режима адресации текстуры оболочки. Использование сопоставления, используемого 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 использует метод прямого вычисления для вычислений индексов текстур в каждом расположении пикселей. Прямая оценка отличается от итеративного подхода в том, что любые неточности в операции демонстрируют более случайное распределение ошибок. Результатом этого является то, что ошибки выборки, возникающие на границах, могут быть более заметными, так как эталонный растризатор не выполняет эту операцию с идеальной точностью.

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

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