Стадия средства слияния вывода

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

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

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

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

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

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

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

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

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

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

Только один буфер глубины трафарета может быть активен в заданный момент времени. Все связанные ресурсов должны соответствовать (по размеру и габаритам) представление глубины трафарета. Это не означает, что размер ресурса должен совпадать — совпадать должен только размер представления.

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

Общие сведения о наложении

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

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

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

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

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

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

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

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

Эта функция позволяет этапу слияния и вывода одновременно использовать оба выходных данных шейдера пикселей (o0 и o1) в качестве входных данных для операции смешивания с одним целевым объектом отрисовки в слоте 0. К допустимым операциям смешения относятся добавление, вычитание и revsubtract. Допустимые варианты смешения для 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

Пиксельный шейдер можно использовать для отображения как минимум восьми отдельных целевых объектов отрисовки, все которые должны быть одного типа (буфер, Texture1D, Texture1DArray и т. д.). Кроме того, все целевые объекты отрисовки должны быть одного размера по всем измерениям (ширина, высота, глубина, размер массива, число выборок). Каждая однобуферная прорисовка может иметь свой формат данных.

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

Общие сведения о маске Output-Write

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

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

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

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

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

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

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