Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложениям не требуется использовать фильтрацию текстур. 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 для этого рисунка, точно находятся на границе между текселями. Используя метод, с помощью которого Direct3D сопоставляет значения, координаты текстуры колеблются в диапазоне от [-0,5 до 4 - 0,5], где 4 — ширина текстуры. В этом случае образец текселя — это 0 тексель для индекса текстуры 1,0. Однако если координата текстуры была лишь немного меньше 1,0, выборка текселя будет n-м текселем вместо 0-го текселя.
Это связано с тем, что при увеличении небольшой текстуры, используя текстурные координаты ровно 0,0 и 1.0 с фильтрацией по ближайшей точке на выровненном по экрану треугольнике, создаются пиксели, для которых выборка текстуры происходит на границе между текселями. Любые неточности в вычислении координат текстуры, однако небольшие, приводят к артефактам вдоль областей в отрисованном изображении, которые соответствуют краям текселя карты текстуры.
Выполнение этого сопоставления текстурных координат с плавающей запятой с целочисленными текселями с идеальной точностью является сложным, вычислительно трудоемким и, как правило, не требуется. Большинство аппаратных реализаций используют итеративный подход для вычислений координат текстуры в каждом расположении пикселя в треугольнике. Итеративные подходы, как правило, скрывают эти неточности, потому что ошибки накапливаются равномерно во время итерации.
Эталонный растризатор Direct3D использует метод прямого вычисления для вычислений индексов текстур в каждом расположении пикселей. Прямая оценка отличается от итеративного подхода в том, что любые неточности в операции демонстрируют более случайное распределение ошибок. Результатом этого является то, что ошибки выборки, возникающие на границах, могут быть более заметными, так как эталонный растризатор не выполняет эту операцию с идеальной точностью.
Лучший подход — использовать фильтрацию ближайшей точки только при необходимости. Когда вы должны использовать его, рекомендуется слегка смещать координаты текстуры от граничных позиций, чтобы избежать артефактов.
Связанные разделы