술어
조건자는 CPU가 아닌 GPU가 개체를 그리거나 복사하거나 디스패치하지 않도록 결정하는 기능입니다.
개요
술어는 일반적으로 폐색에서 사용됩니다. 경계 상자를 그리고 가리면 개체 자체를 그려도 분명히 아무 효과가 없습니다. 이 경우 개체의 그리기를 "조건자"로 설정하여 GPU에서 실제 렌더링에서 제거할 수 있습니다.
처음에는 표준 깊이 테스트와 초기 깊이 패스 이상으로 중복되는 것처럼 보일 수 있습니다. 그러나 조건자는 그리기 명령 상태 자체의 오버헤드와 래스터화를 제거할 수 있습니다. 초기 깊이 패스는 불필요한 픽셀을 제거하지만 꼭짓점, 헐, 도메인 및 기하 도형 셰이더를 실행하고 고정 함수 입력 어셈블러, 테셀레이터 및 래스터라이저를 호출할 수 있습니다. 실제 모델보다 처리 및 래스터화가 더 간단한 간단한 경계 상자 또는 이와 유사한 경계 볼륨을 그리면 불필요한 래스터화 및 처리를 방지할 수 있습니다.
Direct3D 11과 달리 술어는 쿼리에서 분리되며 앱 개발자가 결정할 수 있는 (폐색뿐 아니라) 추론에 따라 애플리케이션이 개체를 서술할 수 있도록 Direct3D 12에서 확장됩니다.
SetPredication
버퍼 내의 64비트 값에 따라 조건자를 설정할 수 있습니다(D3D12_PREDICATION_OP 참조).
GPU는 SetPredication 명령을 실행할 때 버퍼에 값을 맞춥니다. 이후에 버퍼의 데이터가 변경되더라도 소급해서 술어 상태에 영향을 주지 않습니다.
입력 매개 변수 버퍼가 NULL이면 술어를 사용할 수 없습니다.
조건자 힌트는 Direct3D 12 API에 없습니다. 직접, 컴퓨팅 및 복사 명령 목록에는 조건자가 허용됩니다. 원본 버퍼는 모든 힙 유형(기본값, 업로드, 읽기 저장, 사용자 지정)에 있을 수 있습니다.
핵심 런타임은 다음의 유효성을 검사합니다.
- AlignedBufferOffset은 8바이트의 배수입니다.
- 리소스가 버퍼입니다.
- 작업이 열거형의 유효한 멤버입니다.
- SetPredication은 번들 내에서 호출할 수 없습니다.
- 명령 목록 형식이 술어를 지원하지 않습니다.
- 오프셋이 버퍼 크기를 초과하지 않습니다.
원본 버퍼가 D3D12_RESOURCE_STATE_PREDICATION(D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT 동일하고 단순히 별칭) 상태가 아니면 디버그 계층에서 오류가 발생합니다.
서술할 수 있는 작업 세트는 다음과 같습니다.
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle은 자체적으로 서술되지 않습니다. 대신, 번들 쪽에 포함된 위 목록의 개별 작업이 서술됩니다.
ID3D12GraphicsCommandList 메서드 ResolveQueryData, BeginQuery 및 EndQuery는 서술되지 않습니다.
관련 항목