Управление состоянием графического конвейера в Direct3D 12
В этом разделе описывается настройка состояния графического конвейера в Direct3D 12.
Обзор состояния конвейера
При отправке геометрии на рисуемую единицу обработки графики (GPU) существует широкий спектр аппаратных параметров, определяющих интерпретацию и отрисовку входных данных. В совокупности эти параметры называются состоянием графического процесса и включают общие параметры, такие как состояние растеризатора, состояние смешивания и состояние глубинного трафарета, а также тип примитивной топологии отправленной геометрии и шейдеры, которые будут использоваться для рендеринга. В Microsoft Direct3D 12 большинство состояний графического конвейера задаются с помощью объектов состояния конвейера (PSO). Приложение может создавать неограниченное количество этих объектов, представленных интерфейсом ID3D12PipelineState, как правило, во время инициализации. Затем во время отрисовки списки команд могут быстро переключать несколько параметров состояния конвейера, вызывая ID3D12GraphicsCommandList::SetPipelineState в списке прямых команд или пакете, чтобы задать активный PSO.
В Direct3D 11 состояние графического конвейера было упаковано в крупнозернистые объекты состояния, такие как ID3D11BlendState, которые можно создать и задать во время отрисовки в непосредственном контексте с методами, такими как ID3D11DeviceContext::OMSetBlendState. Идея этого заключается в том, что GPU может повысить эффективность, задав связанные параметры, такие как параметры состояния смешения, все сразу. Однако с сегодняшним графическим оборудованием существуют зависимости между различными аппаратными единицами. Например, состояние аппаратного смешения может иметь зависимости от состояния растра, а также состояния смешивания. PsOs в Direct3D 12 предназначены для предварительной обработки всех зависимых параметров в каждом состоянии конвейера, как правило, во время инициализации, чтобы сделать переключение между состояниями во время отрисовки как можно эффективнее.
Обратите внимание, что большинство параметров состояния конвейера задаются с помощью PSOs, существуют некоторые параметры состояния, которые задаются отдельно с помощью API, предоставляемых ID3D12GraphicsCommandList. Эти параметры и связанные API подробно рассматриваются ниже. Кроме того, существуют различия в том, как состояние графического конвейера наследуется и сохраняется из прямых списков команд и пакетов. В этом разделе приведены подробные сведения об этих разделах ниже.
Состояния графического конвейера, настроенные с использованием объектов состояния конвейера
Самый простой способ просмотреть все различные состояния конвейера, которые можно задать с помощью объекта состояния конвейера, — просмотреть справочный раздел для D3D12_GRAPHICS_PIPELINE_STATE_DESC, который передается в ID3D12Device::CreateGraphicsPipelineState при инициализации объекта. Краткий обзор состояний, которые можно задать, включает:
- Байт-код для всех шейдеров, включая вершины, пиксель, домен, корпус и геометрические шейдеры.
- Формат входных вершин.
- Тип примитивной топологии. Обратите внимание, что тип топологии примитивов в сборщике входных данных (точка, линия, треугольник, патч) устанавливается в PSO с помощью перечисления D3D12_PRIMITIVE_TOPOLOGY_TYPE. Примитивная привязка и упорядочение (список строк, полоса строк, полоса линий с данными о зависимостях и т. д.) устанавливается из списка команд с помощью метода ID3D12GraphicsCommandList::IASetPrimitiveTopology.
- Состояние смешивания, состояние растризатора, состояние трафарета глубины.
- Форматы трафарета глубины и целевых объектов отрисовки, а также количество последних.
- Параметры мультисемплинга.
- Буфер выходных данных потоковой передачи.
- Корневая подпись. Дополнительные сведения см. в разделе корневых подписей.
Состояния графического конвейера, заданные вне объекта состояния конвейера
Большинство состояний графического конвейера задаются с помощью PSOS. Однако существует набор параметров состояния конвейера, которые задаются путем вызова методов интерфейса ID3D12GraphicsCommandList из списка команд. В следующей таблице показаны состояния, заданные таким образом, и соответствующие методы.
Государство | Метод |
---|---|
Привязки ресурсов |
IASetIndexBuffer IASetVertexBuffers SOSetTargets OMSetRenderTargets SetDescriptorHeaps Все методы SetGraphicsRoot... Все методы SetComputeRoot... |
Окна просмотра | RSSetViewports |
Прямоугольники отсечения | RSSetScissorRects |
Коэффициент смешивания | OMSetBlendFactor |
Значение ссылки на эталонный уровень глубины | OMSetStencilRef |
Порядок примитивной топологии входных сборок и тип зависимостей | IASetPrimitiveTopology |
Наследование состояния графического конвейера
Так как прямые списки команд обычно предназначены для одного использования одновременно и пакеты предназначены для одновременного использования нескольких раз, существуют разные правила о том, как они наследуют состояние графического конвейера, заданное предыдущими списками команд или пакетами.
Для состояний графического конвейера, заданных с помощью PSOS, ни одно из этих состояний не наследуется прямыми списками команд или пакетами. Начальное состояние графического конвейера для прямых списков команд и пакетов устанавливается во время создания с параметром ID3D12PipelineState для ID3D12Device::CreateCommandList. Если PSO не указано в вызове, используется состояние по умолчанию. Вы можете изменить текущий PSO в списке команд, вызвав ID3D12GraphicsCommandList::SetPipelineState.
Прямые списки команд также не наследуют состояние, которое устанавливается с помощью методов списка команд, таких как RSSetViewports. Дополнительные сведения о начальных значениях по умолчанию для состояний, отличных от PSO, см. в разделе ID3D12GraphicsCommandList::ClearState.
Пакеты наследуют все состояния графического конвейера, которые не заданы с PSOS, за исключением типа примитивной топологии. Примитивная топология всегда имеет значение D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED при запуске пакета. Любое состояние, заданное в пакете (само PSO, состояние, не основанное на PSO, и привязки ресурсов), влияет на состояние родительского списка прямых команд. Например, если RSSetViewports вызывается из пакета, указанные порты просмотра будут по-прежнему задаваться в родительском списке прямых команд для вызовов после вызова ExecuteBundle, который задает порты просмотра.
Привязки ресурсов, заданные в списке команд или пакете, сохраняются. Поэтому привязки ресурсов, измененные в списке прямых команд, по-прежнему будут заданы в рамках последующего выполнения дочернего пакета. Привязки ресурсов, измененные из пакета, по-прежнему будут заданы для последующих вызовов в родительском списке прямых команд.
Дополнительные сведения о привязках см. в разделе "Семантика пакета" из "Использование корневой подписи".