Управление состоянием графического конвейера в Direct3D 12
В этом разделе описывается настройка состояния графического конвейера в Direct3D 12.
Общие сведения о состоянии конвейера
При отправке геометрии в графический процессор (GPU) для рисования существует широкий спектр параметров оборудования, определяющих способ интерпретации и отрисовки входных данных. В совокупности эти параметры называются состоянием графического конвейера и включают общие параметры, такие как состояние растеризатора, состояние смешения и состояние трафарета глубины, а также тип топологии-примитив отправленной геометрии и шейдеры, которые будут использоваться для отрисовки. В Microsoft Direct3D 12 большинство состояний графического конвейера задается с помощью объектов состояния конвейера (PSO). Приложение может создавать неограниченное количество этих объектов, представленных интерфейсом ID3D12PipelineState , обычно во время инициализации. Затем во время отрисовки списки команд могут быстро переключать несколько параметров состояния конвейера, вызывая ID3D12GraphicsCommandList::SetPipelineState в прямом списке команд или пакете, чтобы задать активный PSO.
В Direct3D 11 состояние графического конвейера было объединялось в крупные объекты состояния, такие как ID3D11BlendState , которые можно было создать и задать во время отрисовки в непосредственном контексте с помощью таких методов, как ID3D11DeviceContext::OMSetBlendState. Идея заключается в том, что GPU может повысить эффективность, установив связанные параметры, такие как параметры состояния смешения, все сразу. Однако с современным графическим оборудованием существуют зависимости между различными аппаратными единицами. Например, состояние аппаратного наложения может иметь зависимости от состояния растра, а также состояния смешения. PsOs в Direct3D 12 были разработаны таким образом, чтобы GPU предварительно обрабатывал все зависимые параметры в каждом состоянии конвейера, как правило, во время инициализации, чтобы сделать переключение между состояниями во время отрисовки максимально эффективным.
Обратите внимание, что хотя большинство параметров состояния конвейера задаются с помощью объектов PSOs, некоторые параметры состояния задаются отдельно с помощью ИНТЕРФЕЙСов API, предоставляемых ID3D12GraphicsCommandList. Эти параметры и связанные API подробно рассматриваются ниже. Кроме того, существуют различия в том, как состояние графического конвейера наследуется и сохраняется из списков и пакетов прямых команд. В этом разделе приведены подробные сведения об этих двух из приведенных ниже.
Состояния графического конвейера, заданные с объектами состояния конвейера
Самый простой способ просмотреть все различные состояния конвейера, которые можно задать с помощью объекта состояния конвейера, — просмотреть справочный раздел для D3D12_GRAPHICS_PIPELINE_STATE_DESC , который передается в ID3D12Device::CreateGraphicsPipelineState при инициализации объекта. Краткая сводка состояний, которые можно задать, включает в себя:
- Байт-код для всех шейдеров, включая вершины, пиксели, домен, корпус и геометрические шейдеры.
- Формат входной вершины.
- Тип топологии-примитив. Обратите внимание, что тип топологии-примитив input-ассемблер (точка, линия, треугольник, исправление) задается в 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 , задающего окна просмотра.
Привязки ресурсов, заданные в списке команд или пакете, сохраняются. Поэтому привязки ресурсов, измененные в списке прямых команд, будут по-прежнему задаваться в рамках последующего выполнения дочернего пакета. Привязки ресурсов, измененные из пакета, по-прежнему будут задаваться для последующих вызовов в родительском списке прямых команд.
Дополнительные сведения о привязках см. в разделе Семантика пакетастатьи Использование корневой сигнатуры.