실제 GPU에서 사용될 자원들이 어떤 레지스터에 어떻게 바인딩 될것인지를 정의하는 객체다.
즉, GPU에서 사용될 자원들에 대해서 설명한다고 볼 수 있다.
아래와 같은 방식으로 정의가 가능하다. 하나하나 짚어보도록 하자.
CD3DX12_ROOT_PARAMETER는 바인딩 방식을 정의한다.
바인딩 되는 방식은 세가지로 나뉘어 지는데, 아래와 같다.
Root Constant
: Resource를 바인딩 한다.
Root Descriptor
: Descriptor를 바인딩 한다.
Root Descriptor Table
: Descriptor Table을 바인딩 한다.
Table의 경우 CD3DX12_DESCRIPTOR_RANGE를 통해서 범위를 정해줄 수 있다.
Root Signature는 다음과 같은 제약이 있기 때문에 위와 같이 방식이 나뉘어져 있다.
64개의 DWORD 제한
Root Constant:
32비트 상수당 DWORD 한 개.
Root Descriptor
: DWORD 두 개.
Root Descriptor Table
: DWORD 한 개
각각을 쓰는 기준은 사용하고자 하는 Shader에 상황에 따라 달라진다.
얼마나 많은 리소스가 사용되는지, 얼마나 큰 리소스가 올라가야 하는지 등등..
간단한 Constant Buffer는 Root Constant를 쓰고 텍스쳐는 Descriptor Table을 쓴다던지...
D3D12SerializeRootSignature를 통해서 내부에서 사용할 수 있는 serialize된 형태로 변환한다.
이후 CD3DX12_ROOT_SIGNATURE_DESC를 통해서 값을 지정하고 CreateRootSignature를 통해 Root Signature를 생성한다.