다음을 통해 공유


루트 서명에서 직접 설명자 사용

설명자 힙을 통과할 필요가 없도록 설명자를 루트 서명에 직접 넣을 수 있습니다. 이러한 설명자는 루트 서명에서 많은 공간을 차지하므로( 루트 서명 제한 참조) 자주 사용하는 것이 좋습니다.

예를 들어 그리기당 변경되는 CBV(상수 버퍼 뷰)를 루트 레이아웃에 배치하는 것이 좋습니다. 따라서 그리기당 애플리케이션에서 설명자 힙 공간을 할당할 필요가 없습니다(설명자 힙의 새 위치에 설명자 테이블을 가리키는 저장). 루트 서명에 무언가를 넣으면 애플리케이션은 단지 버전 관리 책임을 드라이버에게 전달하는 것일 뿐입니다. 하지만 드라이버가 이미 가지고 있는 인프라입니다.

매우 적은 리소스를 사용하는 렌더링의 경우 필요한 모든 설명자를 루트 서명에 직접 배치할 수 있는 경우 설명자 테이블/힙 사용이 전혀 필요하지 않을 수 있습니다.

루트 서명에서 지원되는 유일한 설명자 유형입니다.

  • CBV(상수 버퍼 뷰).
  • 형식 변환이 필요하지 않은 버퍼 리소스의 SRV(셰이더 리소스 뷰) /UAV(순서가 지정되지 않은 액세스 뷰)입니다(형식화되지 않은 버퍼). 루트 설명자로 바인딩할 수 있는 형식화되지 않은 버퍼의 몇 가지 예로는 , RWStructuredBuffer<type>RWByteAddressBufferByteAddressBuffer 있습니다StructuredBuffer<type>. 및 Buffer<float2> 와 같은 Buffer<uint> 형식화된 버퍼는 사용할 수 없습니다.
  • 로컬 또는 전역 루트 서명에서 광선 추적 가속 구조의 SRV.

루트의 UAV에는 연결된 카운터가 있을 수 없습니다. 루트 서명의 설명자는 각각 개별 개별 설명자로 표시되며 동적으로 인덱싱할 수 없습니다.

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

위의 예제 mySceneData 에서는 루트 서명의 설명자에 매핑되는 것처럼 를 배열 cbuffer mySceneData[2] 로 선언할 수 없습니다. 이는 설명자 간 인덱싱이 루트 서명에서 지원되지 않기 때문입니다. 원하는 경우 별도의 개별 상수 버퍼를 정의하고 각각 루트 서명에 별도의 항목으로 정의할 수 있습니다. 위의 mySceneData 내에는 bar[2] 배열이 있습니다. 상수 버퍼 내의 동적 인덱싱은 유효합니다. 루트 서명의 설명자는 설명자 힙을 통해 액세스한 경우 동일한 설명자가 동작하는 것처럼 동작합니다. 이는 인라인 상수 내에서 동적 인덱싱이 허용되지 않으므로 bar[2] 허용되지 않는다는 제약 조건을 제외하고 상수 버퍼처럼 표시되는 루트 서명에서 직접 상수를 인라인하는 것과는 대조적입니다.

ID3D12GraphicsCommandList 인터페이스의 이러한 API는 루트 서명에서 직접 설명자를 설정하기 위한 것입니다.

참고

Direct3D 12에는 루트 설명자 배열 의 개념이 없습니다. 설명자 배열은 설명자 힙에서만 지원됩니다.