Direct3D 12에서 그래픽 파이프라인 상태 관리
이 항목에서는 Direct3D 12에서 그래픽 파이프라인 상태를 설정하는 방법을 설명합니다.
파이프라인 상태 개요
기하 도형을 그리기 위해 GPU(그래픽 처리 장치)로 전송할 경우 입력 데이터가 해석 및 렌더링되는 방식을 결정하는 다양한 하드웨어 설정이 있습니다. 종합적으로 이러한 설정을 그래픽 파이프라인 상태라고 하며, 래스터라이저 상태, 혼합 상태, 깊이 스텐실 상태와 같은 일반적인 설정과, 렌더링에 사용될 제출된 기하 도형 및 셰이더의 기본 토폴로지 형식을 포함됩니다. Microsoft Direct3D 12에서 대부분의 그래픽 파이프라인 상태는 PSO(파이프라인 상태 개체)를 사용하여 설정합니다. 앱은 일반적으로 초기화 시에 ID3D12PipelineState 인터페이스로 나타내는 이러한 개체를 개수에 제한없이 만들 수 있습니다. 그런 다음, 렌더링 시에 명령 목록은 직접 명령 목록이나 번들에서 ID3D12GraphicsCommandList::SetPipelineState를 호출하여 활성 PSO를 설정함으로써 파이프라인 상태의 여러 설정 간을 빠르게 전환할 수 있습니다.
Direct3D 11에서 그래픽 파이프라인 상태는 ID3D11DeviceContext::OMSetBlendState와 같은 메서드를 사용하여 즉각적인 컨텍스트에서 렌더링 시간에 생성 및 설정될 수 있는 ID3D11BlendState와 같은 좀 더 크고 덜 세분화된 상태 개체로 번들화되었습니다. 기본 개념은 GPU가 혼합 상태 설정과 같은 관련 설정을 한 번에 모두 지정하여 효율성을 얻는다는 것입니다. 그러나 오늘날의 그래픽 하드웨어를 사용할 경우 여러 하드웨어 장치 간에 종속성이 있습니다. 예를 들어, 하드웨어 혼합 상태는 혼합 상태 뿐만 아니라 래스터 상태에도 종속될 수 있습니다. Direct3D 12의 PSO는 GPU가 일반적으로 초기화 중에 각 파이프라인 상태의 모든 종속 설정을 미리 처리하여 렌더링 시에 가능한 한 효율적으로 상태 간을 전환할 수 있도록 디자인되었습니다.
대부분의 파이프라인 상태 설정은 PSO를 사용하여 지정되지만, ID3D12GraphicsCommandList에서 제공하는 API를 사용하여 별도로 지정하는 상태 설정도 있습니다. 이러한 설정 및 관련 API는 아래에서 자세히 설명합니다. 또한 그래픽 파이프라인 상태가 직접 명령 목록 및 번들을 통해 상속 및 지속되는 방식에도 차이가 있습니다. 이 항목에서는 이러한 두 가지 사항을 자세히 설명합니다.
파이프라인 상태 개체로 설정된 그래픽 파이프라인 상태
파이프라인 상태 개체를 사용하여 설정할 수 있는 다양한 파이프라인 상태를 모두 확인하는 가장 쉬운 방법은 개체를 초기화할 때 ID3D12Device::CreateGraphicsPipelineState에 전달하는 D3D12_GRAPHICS_PIPELINE_STATE_DESC 대한 참조 항목을 확인하는 것입니다. 설정할 수 있는 상태 요약에는 다음이 포함됩니다.
- 꼭짓점, 픽셀, 도메인, 헐 및 기하 도형 셰이더를 포함하여 모든 셰이더의 바이트 코드
- 입력 꼭짓점 형식
- 기본 토폴로지 형식 입력 어셈블러 기본 토폴로지 형식(점, 선, 삼각형, 패치)은 D3D12_PRIMITIVE_TOPOLOGY_TYPE 열거형을 사용하여 PSO 내에서 설정됩니다. 기본 인접성 및 순서(선 목록, 선 스트립, 인접 데이터가 있는 선 스트립 등)는 ID3D12GraphicsCommandList::IASetPrimitiveTopology 메서드를 사용하여 명령 목록 내에서 설정합니다.
- 블렌드 상태, 래스터라이저 상태, 깊이 스텐실 상태
- 깊이 스텐실 및 렌더링 대상 형식, 렌더링 대상 개수
- 다중 샘플링 매개 변수
- 스트리밍 출력 버퍼
- 루트 서명. 자세한 내용은 루트 서명을 참조하세요.
파이프라인 상태 개체 외부에서 설정한 그래픽 파이프라인 상태
대부분의 그래픽 파이프라인 상태는 PSO를 사용하여 설정합니다. 그러나 명령 목록 내에서 ID3D12GraphicsCommandList 인터페이스의 메서드를 호출하여 설정한 파이프라인 상태 매개 변수 세트도 있습니다. 다음 표에서는 이 방법으로 설정한 상태와 해당 메서드를 보여 줍니다.
시스템 상태 | 메서드 |
---|---|
리소스 바인딩 |
IASetIndexBuffer IASetVertexBuffers SOSetTargets OMSetRenderTargets SetDescriptorHeaps 모든 SetGraphicsRoot... 메서드 모든 SetComputeRoot... 메서드 |
뷰포트 | RSSetViewports |
가위 사각형 | RSSetScissorRects |
블렌드 요소 | OMSetBlendFactor |
깊이 스텐실 참조 값 | OMSetStencilRef |
입력 어셈블러 기본 토폴로지 순서 및 인접 형식 | IASetPrimitiveTopology |
그래픽 파이프라인 상태 상속
직접 명령 목록은 일반적으로 한 번에 한 가지 용도로 사용되며, 번들은 동시에 여러 번 사용할 수 있도록 고안되었으므로 이전 명령 목록 또는 번들이 설정한 그래픽 파이프라인 상태를 상속하는 방식에 대해 다른 규칙이 적용됩니다.
PSO를 사용하여 설정하는 그래픽 파이프라인 상태의 경우 어떤 상태도 직접 명령 목록 또는 번들에서 상속되지 않습니다. 직접 명령 목록 및 번들에 대한 초기 그래픽 파이프라인 상태는 생성 시에 ID3D12Device::CreateCommandList에 대한 ID3D12PipelineState 매개 변수를 사용하여 설정됩니다. 호출에서 PSO를 지정하지 않으면 기본 초기 상태가 사용됩니다. ID3D12GraphicsCommandList::SetPipelineState를 호출하여 명령 목록 내에서 현재 PSO를 변경할 수 있습니다.
또한 직접 명령 목록은 RSSetViewports와 같은 명령 목록 메서드로 설정한 상태를 상속하지 않습니다. 비 PSO 상태의 초기 기본값에 대한 자세한 내용은 ID3D12GraphicsCommandList::ClearState를 참조하세요.
번들은 기본 토폴로지 형식을 제외하고 PSO로 설정하지 않은 모든 그래픽 파이프라인 상태를 상속합니다. 기본 토폴로지는 번들이 실행되기 시작할 때 항상 D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED 설정됩니다. 번들 내에서 설정한 모든 상태(PSO 자체, 비 PSO 기반 상태 및 리소스 바인딩)은 해당 부모 직접 명령 목록의 상태에 영향을 줍니다. 예를 들어 번들 내에서 RSSetViewports 를 호출하는 경우 뷰포트를 설정하는 ExecuteBundle 호출 이후의 호출에 대해 지정된 뷰포트가 부모 직접 명령 목록에 계속 설정됩니다.
명령 목록 또는 번들 내에서 설정하는 리소스 바인딩을 지속됩니다. 따라서 직접 명령 목록에서 수정된 리소스 바인딩은 여전히 후속 자식 번들 실행 내에서 설정됩니다. 또한 번들 내에서 수정되는 리소스 바인딩은 부모 직접 명령 목록 내의 후속 호출에 대해 계속 설정됩니다.
바인딩에 대한 자세한 내용은 루트 서명 사용의 번들 의미 체계 섹션을 참조하세요.