간접 그리기를 사용하면 일부 장면 통과 및 컬링을 CPU에서 GPU로 이동할 수 있으므로 성능이 향상될 수 있습니다. 명령 버퍼는 CPU 또는 GPU에서 생성할 수 있습니다.
- 명령 서명
- 간접 인수 버퍼 구조
-
명령 서명 만들기
- 인수 변경 사항 없음
- 루트 상수 및 꼭짓점 버퍼
- 관련 항목
명령 서명
명령 서명 개체(ID3D12CommandSignature)를 사용하면 앱이 간접 그리기를 지정할 수 있으며, 특히 다음 설정을 지정할 수 있습니다.
- 간접 인수 버퍼 형식입니다.
- 사용할 명령 형식입니다(ID3D12GraphicsCommandList 메서드 DrawInstanced, DrawIndexedInstanced또는 Dispatch).
- 명령 호출마다 변경되는 리소스 바인딩 집합 대 상속되는 집합.
시작 시 앱은 작은 명령 서명집합을 만듭니다. 런타임 시 애플리케이션은 앱 개발자가 선택하는 모든 수단을 통해 명령으로 버퍼를 채웁니다. 필요에 따라 꼭짓점 버퍼 뷰, 인덱스 버퍼 뷰, 루트 상수 및 루트 설명자(원시 또는 구조화된 SRV/UAV/CBV)에 대해 설정할 상태를 포함하는 명령입니다. 이러한 인수 레이아웃은 하드웨어와 관련이 없으므로 앱은 버퍼를 직접 생성할 수 있습니다. 명령 서명은 명령 목록에서 나머지 상태를 상속합니다. 그런 다음 앱은 ExecuteIndirect 호출하여 GPU에 특정 명령 서명에 정의된 형식에 따라 간접 인수 버퍼의 내용을 해석하도록 지시합니다.
명령 서명이 루트 인수를 변경하는 경우 명령 서명 내에 루트 서명의 하위 집합으로 저장됩니다.
실행이 완료된 후 명령 서명 상태가 명령 목록으로 다시 누출되지 않습니다. 그러나 ExecuteIndirect 후에는 모든 바인딩이 알려진 값으로 다시 설정됩니다. 특히:
- 명령 서명이 특정 슬롯에 꼭짓점 버퍼를 바인딩하는 경우 ExecuteIndirect 호출되면 NULL 꼭짓점 버퍼가 해당 슬롯에 바인딩됩니다.
- 명령 서명이 인덱스 버퍼를 바인딩하는 경우 ExecuteIndirect 후 NULL 인덱스 버퍼가 바인딩됩니다.
- 명령 서명이 루트 상수로 설정된 경우 ExecuteIndirect 호출되면 루트 상수 값이 0으로 설정됩니다.
- 명령 서명이 루트 뷰(CBV/SRV/UAV)를 설정하는 경우 ExecuteIndirect 호출되면 루트 뷰가 NULL 보기로 설정됩니다.
명령 서명을 사용하는 예제: 앱 개발자가 간접 인수 버퍼에서 그리기별 호출에 고유한 루트 상수 지정을 원한다고 가정합니다. 앱은 명령 서명을 생성하여, 간접 인수 버퍼가 그리기 호출마다 다음 매개변수를 지정할 수 있게 합니다.
- 하나의 루트 상수 값입니다.
- 그리기 인수(꼭짓점 수, 인스턴스 수 등)입니다.
애플리케이션에서 생성된 간접 인수 버퍼에는 고정 크기 레코드 배열이 포함됩니다. 각 구조체는 하나의 그리기 호출에 해당합니다. 각 구조체에는 그리기 인수와 루트 상수의 값이 포함됩니다. 그리기 호출 수는 별도의 GPU 표시 버퍼에 지정됩니다.
앱에서 생성된 명령 버퍼 예제는 다음과 같습니다.
간접 인수 버퍼 구조
다음 구조는 특정 인수가 간접 인수 버퍼에 표시되는 방식을 정의합니다. 이러한 구조체는 D3D12 API에 표시되지 않습니다. 애플리케이션은 간접 인수 버퍼(CPU 또는 GPU 사용)에 쓸 때 이러한 정의를 사용합니다.
- D3D12_DRAW_ARGUMENTS
- ko-KR: D3D12_DRAW_INDEXED_ARGUMENTS
- D3D12_DISPATCH_ARGUMENTS
- D3D12_VERTEX_BUFFER_VIEW
- D3D12_INDEX_BUFFER_VIEW
- D3D12_GPU_VIRTUAL_ADDRESS(UINT64의 typedef 동의어).
- D3D12_CONSTANT_BUFFER_VIEW
명령 서명 만들기
명령 서명을 만들려면 다음 API 항목을 사용합니다.
- ID3D12Device::CreateCommandSignature(ID3D12CommandSignature출력되는)
- D3D12_INDIRECT_ARGUMENT_TYPE
- D3D12_INDIRECT_ARGUMENT_DESC
- D3D12_COMMAND_SIGNATURE_DESC
간접 인수 버퍼 내의 인수 순서는 D3D12_COMMAND_SIGNATURE_DESCpArguments 매개 변수에 지정된 인수 순서와 정확히 일치하도록 정의됩니다. 간접 인수 버퍼 내의 하나의 그리기(그래픽)/디스패치(컴퓨팅) 호출에 대한 모든 인수는 긴밀하게 압축됩니다. 그러나 애플리케이션은 간접 인수 버퍼에서 그리기/디스패치 명령 간에 임의의 바이트 보폭을 지정할 수 있습니다.
명령 서명이 루트 인수 중 하나를 변경하는 경우에만 루트 서명을 지정해야 합니다.
루트 SRV/UAV/CBV의 경우 애플리케이션에서 지정한 크기는 바이트 단위입니다. 디버그 계층은 주소에 대한 다음 제한 사항의 유효성을 검사합니다.
- CBV – 주소는 256바이트의 배수여야 합니다.
- 원시 SRV/UAV – 주소는 4바이트의 배수여야 합니다.
- 구조적 SRV/UAV – 주소는 구조 바이트 간격(셰이더에 선언됨)의 배수여야 합니다.
지정된 명령 서명은 그리기 또는 컴퓨팅 명령 서명입니다. 명령 서명에 그리기 작업이 포함된 경우 그래픽 명령 서명입니다. 그렇지 않으면 명령 서명에 디스패치 작업이 포함되어야 하며 컴퓨팅 명령 서명입니다.
다음 섹션에서는 몇 가지 예제 명령 서명을 보여 줍니다.
인수 변경 없음
이 예제에서는 애플리케이션에서 생성된 간접 인수 버퍼에 36비트 구조체의 배열이 있습니다. 각 구조체에는 drawIndexedInstanced전달된 5개의 매개 변수만 포함됩니다(패딩 포함).
명령 서명 설명을 만드는 코드는 다음과 같습니다.
D3D12_INDIRECT_ARGUMENT_DESC Args[1];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED;
D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 36;
ProgramDesc.NumArgumentDescs = 1;
ProgramDesc.pArguments = Args;
간접 인수 버퍼 내의 단일 구조체 레이아웃은 다음과 같습니다.
| 바이트 | 묘사 |
|---|---|
| 0:3 | 인스턴스당 인덱스 수 |
| 4:7 | 인스턴스 수량 |
| 8:11 | 시작 인덱스 위치 |
| 12:15 | BaseVertexLocation |
| 16:19 | StartInstanceLocation |
| 20:35 | 패딩 |
루트 상수 및 꼭짓점 버퍼
이 예제에서 간접 인수 버퍼의 각 구조는 두 개의 루트 상수, 하나의 꼭짓점 버퍼 바인딩을 변경하고 인덱싱되지 않은 그리기 작업을 수행합니다. 구조체 사이에 패딩이 없습니다.
명령 서명 설명을 만드는 코드는 다음과 같습니다.
D3D12_INDIRECT_ARGUMENT_DESC Args[4];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[0].Constant.RootParameterIndex = 2;
Args[0].Constant.DestOffsetIn32BitValues = 0;
Args[0].Constant.Num32BitValuesToSet = 1;
Args[1].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[1].Constant.RootParameterIndex = 6;
Args[1].Constant.DestOffsetIn32BitValues = 0;
Args[1].Constant.Num32BitValuesToSet = 1;
Args[2].Type = D3D12_INDIRECT_ARGUMENT_TYPE_VERTEX_BUFFER_VIEW;
Args[2].VertexBuffer.Slot = 3;
Args[3].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 40;
ProgramDesc.NumArgumentDescs = 4;
ProgramDesc.pArguments = Args;
간접 인수 버퍼 내의 단일 구조체 레이아웃은 다음과 같습니다.
| 바이트 | 묘사 |
|---|---|
| 0:3 | 루트 매개 변수 인덱스 2에 대한 데이터 |
| 4:7 | 루트 매개 변수 인덱스 6에 대한 데이터 |
| 8:15 | 슬롯 3의 VB 가상 주소(64비트) |
| 16:19 | VB 크기 |
| 20:23 | VB 스트라이드 |
| 24:27 | 인스턴스당 정점 수 |
| 28:31 | 인스턴스 수 |
| 32:35 | StartVertexLocation |
| 36:39 | 인스턴스시작위치 |
관련 항목