Правила растеризации

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

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

Правила растеризации треугольника (без множественной дискретизации)

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

Где:

  • верхняя сторона — это сторона, которая размещено строго по горизонтали и выше других сторон;
  • Левый край — это ребро, которое не является точно горизонтальным и находится в левой части треугольника. Треугольник может иметь один или два левых края.

Правило "верхнего левого" гарантирует, что смежные треугольники рисуются один раз.

На этом рисунке показаны примеры пикселей, которые рисуются, так как они размещены внутри треугольника или соответствуют правилу "верхнего левого".

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

Светлыми и темно-серыми квадратами показаны группы пикселей, чтобы обозначить, внутри каких треугольников они находятся.

Правила растеризации линий (без сглаживания, без множественной дискретизации)

Правила растеризации линий используют ромбовидную тестовую область, чтобы определить, охватывает ли линия пиксель. Для основных линий сетки x (у которых –1 <= наклон <= +1) в ромбовидную область проверки (показана сплошным цветом) включены левый нижний и правый нижний край, а также нижний угол; из ромба исключаются (показана пунктиром) левый верхний и правый верхний край, а также верхний, левый и правый угол. Основная линия сетки y — это любая линия, не являющаяся основной линией сетки x. Ромбовидная тестовая область описывается так же, как и для x, но в нее также включен правый угол.

В ромбовидной области линия охватывает пиксель, если она есть в ромбовидной тестовой области при обходе линии с начала до конца. Ломаная ведет себя так же, как при ее отрисовке в виде последовательности линий.

На следующем рисунке представлены некоторые примеры.

Иллюстрация примеров растеризации линий с псевдонимом

Правила растеризации линий (со сглаживанием, без множественной дискретизации)

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

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

Иллюстрация примеров сглаживания растеризации линий

Этот алгоритм создает относительно плавные линии одинаковой интенсивности с минимальным числом неровных краев или искажений. Образование муарового узора для рядом расположенных линий минимизировано. Обеспечивается хорошее покрытие соединений между сегментами линий, размещенными возле концов. Ядро фильтра — это разумный компромисс между объем размытия краев и изменениями интенсивности, вызванными гамма-коррекцией. Значение покрытия умножается на пиксельный шейдер o0.a (srcAlpha) в соответствии со следующей формулой на этапе слияния-вывода: srcColor * srcAlpha + destColor * (1-srcAlpha).

Правила растеризация точки (без множественной дискретизации)

Точка интерпретируется как состоящая из двух треугольников в Z-шаблоне, для которого используются правила растеризации треугольника. Координата определяет центр квадрата шириной один пиксель. Для точек отбрасывание не выполняется.

На следующем рисунке представлены некоторые примеры.

Иллюстрация примеров растеризации точек

Правила растеризации со сглаживанием и множественной дискретизацией

Сглаживание со множественной дискретизацией (MSAA) уменьшает геометрические искажения, используя тесты покрытия пикселей и трафарета глубины в нескольких местах из подмножества выборки. Для повышения производительности пиксельные вычисления выполняются один раз для каждого охваченного пикселя за счет совместного использования выходных данных шейдера для всех охваченных пикселей. Множественное сглаживание не уменьшает искажения поверхности. Расположения выборки и функции реконструкции зависят от аппаратной реализации.

На следующем рисунке представлены некоторые примеры.

Иллюстрация примеров многопримерной растеризации сглаживания

Количество расположений выборки зависит от режима множественной дискретизации. Интерполяции атрибутов вершин происходит в центре пикселей, т. к. здесь вызывается пиксельный шейдер (это становится экстраполяцией, если центр не охвачен). Атрибуты могут быть отмечены в пиксельном шейдере для центроидной дискретизации, из-за чего незатронутые пиксели интерполируют атрибут на пересечения области пикселя и примитива. Пиксельный шейдер запускается для каждой области размером 2x2 пикселя для поддержки производных вычислений (в которых используется дельта x и y). Это означает, что шейдер вызывается чаще, чем показано, для заполнения минимального кванта 2x2 (который не зависит от множественной дискретизации). Результат шейдера записывается для каждого охваченного образца, который прошел тест трафарета глубины.

Правила растеризации для примитивов, в целом, не изменяются при множественном сглаживании, за исключением следующие случаев:

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

    Линия считается прямоугольником, состоящим из двух треугольников с толщиной линии 1,4;

  • для точки тест покрытия выполняется для каждого расположения образца (а не для центра пикселя).

Многие форматы поддерживают многофакторную выборку (см. раздел Поддержка оборудования для форматов Direct3D 10). Некоторые форматы могут быть разрешены (ResolveSubresource; в результате чего формат с несколькими дискретизациями сокращается до размера выборки 1). Форматы множественной дискретизации могут использоваться в целях отрисовки, которые могут быть считаны в шейдеры с помощью загрузки, так как разрешение для отдельных образцов, к которым обращается шейдер, не требуется. Форматы глубины не поддерживаются для ресурса множественной дискретизации, поэтому форматы глубины ограничены только целями прорисовки.

Бестипные форматы (например, R8G8B8A8_TYPELESS) поддерживают многофакторную выборку, чтобы представление ресурсов интерпретировать данные различными способами. Например, можно создать ресурс с несколькими выборками, используя R8G8B8A8_TYPELESS, выполнить отрисовку с помощью ресурса render-target-view с R8G8B8A8_UINT форматом, а затем разрешить содержимое в другой ресурс с R8G8B8A8_UNORM форматом данных.

Поддержка оборудования

API сообщает о поддержке оборудования для множественной дискретизации с помощью ряда проверок качества. Например, уровень качества 0 означает, что множественная дискретизация (на определенном уровне формата и качества) не поддерживается оборудованием. Уровень качества 3 означает, что оборудование поддерживает три разных макета образца и алгоритма разрешения. Вы также можете предположить следующее:

  • любой формат, который поддерживает множественную дискретизацию, поддерживает одинаковое число уровней качества для каждого формата этого семейства;
  • Каждый формат, поддерживающий многонамерную выборку и имеющий форматы _UNORM, _SRGB, _SNORM или _FLOAT, также поддерживает разрешение.

Центроидная дискретизация атрибутов при множественном сглаживании

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

Средство программной прорисовки выбирает расположение образца для центроидной дискретизации следующим образом.

  • Маска дискретизации разрешает все образцы. Центр пикселя используется, если пиксель охвачен или ни один из образцов не охвачен. В противном случае выбирается первый охваченный образец начиная от центра пикселя и с перемещением вперед.
  • Маска дискретизации отключает все образцы, кроме одного (общий сценарий). Приложение может реализовывать многопроходную супердискретизацию, перебирая одноразрядные значения маски дискретизации и повторно отрисовывая сцену для каждого образца, используя центроидную дискретизации. Для этого приложению потребуется настроить производные данные, чтобы выбрать более детализированные MIP текстур для повышения плотности дискретизации текстур.

Производные вычисления при множественной дискретизации

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

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

Этап растеризации