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


этап Output-Merger

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

Различия между Direct3D 9 и Direct3D 10:

  • Direct3D 9 реализует альфа-тестирование (с помощью состояния альфа-тестирования) для управления записью пикселя в целевой объект вывода отрисовки.
  • Direct3D 10 и более поздних версий не реализует альфа-тест (или состояние альфа-тестирования). Это можно контролировать с помощью шейдера пикселей или с функциональностью глубины или набора элементов.

Обзор тестирования Depth-Stencil

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

схема работы тестирования элементов глубины

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

Процесс использования буфера глубины для определения того, какой пиксель должен быть нарисован, называется буферизацией глубины, иногда называется z-buffering.

Когда значения глубины достигают этапа слияния выходных данных (независимо от интерполяции или из шейдера пикселей) они всегда зажаты: z = z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) в соответствии с форматом и точностью буфера глубины, используя правила с плавающей запятой. После закрепления значение глубины сравнивается (с помощью DepthFunc) с существующим значением буфера глубины. Если буфер глубины не привязан, тест глубины всегда проходит.

Если в формате буфера глубины отсутствует компонент наборов элементов или нет границы буфера глубины, тест набора элементов всегда проходит. В противном случае функциональность не изменяется из Direct3D 9.

Одновременно может быть активен только один буфер глубины или набора элементов; любое связанное представление ресурсов должно соответствовать (одному и тому же размеру) представлению глубины или набора элементов. Это не означает, что размер ресурса должен совпадать, только то, что размер представления должен соответствовать.

Дополнительные сведения о тестировании элементов глубины см. в учебнике 14.

Обзор смешивания

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

схема работы смешивания данных

Концептуально вы можете визуализировать эту блок-диаграмму, реализованную дважды на этапе слияния выходных данных: первая объединяет данные RGB, а второй — альфа-данные. Чтобы узнать, как использовать API для создания и задания состояния смешения, см. настройка функций смешивания.

Фиксированное сочетание функций можно включить независимо для каждого целевого объекта отрисовки. Однако существует только один набор элементов управления смесью, поэтому одна и та же смесь применяется ко всем renderTargets с включенным сочетанием. Значения смешивания (включая BlendFactor) всегда зажаты в диапазон формата целевого отрисовки перед смешения. Зажимирование выполняется на целевой объект отрисовки, учитывая тип целевого объекта отрисовки. Единственное исключение — для форматов float16, float11 или float10, которые не зажаты таким образом, чтобы операции с сочетанием этих форматов могли выполняться по крайней мере с равной точностью или диапазоном в качестве выходного формата. NaN и подписанные нули распространяется во всех случаях (включая 0,0 весов смешения).

При использовании целевых объектов отрисовки sRGB среда выполнения преобразует целевой цвет отрисовки в линейное пространство перед выполнением смешивания. Среда выполнения преобразует окончательное смешанное значение обратно в пространство SRGB, прежде чем сохранить значение обратно в целевой объект отрисовки.

Различия между Direct3D 9 и Direct3D 10:

  • В Direct3D 9 можно включить смешивание фиксированной функции независимо для каждого целевого объекта отрисовки.
  • В Direct3D 10 и более поздних версиях существует одно описание состояния смешения; Таким образом, для всех целевых объектов отрисовки можно задать одно значение смешения.

Dual-Source смешивание цветов

Эта функция позволяет этапу слияния выходных данных одновременно использовать выходные данные шейдера пикселей (o0 и o1) в качестве входных данных для операции смешивания с одним целевым объектом отрисовки в слоте 0. Допустимые операции смешения включают: добавление, вычитание и повторную очистку. Допустимые параметры смешивания для SrcBlend, DestBlend, SrcBlendAlpha или DestBlendAlpha включают: D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA. Уравнение смешения и маска записи выходных данных указывают, какие компоненты шейдера пикселей выводится. Дополнительные компоненты игнорируются.

Запись в другие выходные данные шейдера пикселей (o2, o3 и т. д.) не определена; Вы можете не записывать данные в целевой объект отрисовки, если он не привязан к слоту 0. Запись oDepth допустима во время смешивания цветов с двумя источниками.

Примеры см. в разделе смешивания выходных данных шейдера пикселей.

Обзор нескольких renderTargets

Шейдер пикселей можно использовать для отрисовки по крайней мере 8 отдельных целевых объектов отрисовки, все из которых должны быть одинаковыми типами (буфер, Текстур1D, Текстур1DArray и т. д.). Кроме того, все целевые объекты отрисовки должны иметь одинаковый размер во всех измерениях (ширина, высота, глубина, размер массива, количество выборок). Каждый целевой объект отрисовки может иметь другой формат данных.

Вы можете использовать любое сочетание слотов целевых объектов отрисовки (до 8). Однако представление ресурсов не может быть привязано к нескольким слотам render-target-target одновременно. Представление может использоваться повторно, если ресурсы не используются одновременно.

Обзор маски Output-Write

Используйте маску для записи выходных данных для управления данными (для каждого компонента), которые можно записать в целевой объект отрисовки.

Обзор примера маски

Пример маски — это 32-разрядная многофакторная маска покрытия, которая определяет, какие образцы обновляются в активных целевых объектах отрисовки. Допускается только один пример маски. Сопоставление битов в маске образца с примерами в ресурсе определяется пользователем. Для отрисовки n-образец используются первые n-биты (из LSB) маски образца (32 бита, максимальное число битов).

В этом разделе

Тема Описание
Настройка функций Depth-Stencil
В этом разделе рассматриваются действия по настройке буфера элементов глубины и состояния элементов глубины для этапа слияния выходных данных.
настройка функций смешивания
Операции смешивания выполняются при каждом выходе шейдера пикселей (значение RGBA) перед записью выходного значения в целевой объект отрисовки. Если включена многосамплинг, смешивание выполняется для каждой многосамплии; в противном случае смешивание выполняется на каждом пикселе.
смещения глубины
Многоугольники, которые являются сопланарными в трехмерном пространстве, могут отображаться так, как если бы они не coplanar, добавив z-предвзятость (или глубину смещения) к каждому из них.

графического конвейера

этапы конвейера (Direct3D 10)