루트 서명에서 직접 상수 사용
애플리케이션은 루트 서명에서 루트 상수(각각 32비트 값 집합)를 정의할 수 있습니다. HLSL(High Level Shading Language)에서는 그것들이 상수 버퍼로 나타납니다. 기록상의 이유로 상수 버퍼는 4x32비트 값 집합으로 표시됩니다.
각 사용자 상수 집합은 셰이더에서 동적으로 인덱싱 가능하고 읽기 전용인 32개의 -bit 값으로 구성된 스칼라 배열로 처리됩니다. 지정된 루트 상수 집합을 인덱싱하는 범위를 벗어나면 정의되지 않은 결과가 생성됩니다. HLSL에서 사용자 상수에 대한 데이터 구조 정의를 제공하여 형식을 제공할 수 있습니다. 예를 들어 루트 서명이 4개의 루트 상수 집합을 정의하는 경우 HLSL은 다음 구조를 오버레이할 수 있습니다.
struct DrawConstants
{
uint foo;
float2 bar;
int moo;
};
ConstantBuffer<DrawConstants> myDrawConstants : register(b1, space0);
루트 서명 공간에서 동적 인덱싱이 지원되지 않으므로 루트 상수에 매핑되는 상수 버퍼에서는 배열이 허용되지 않습니다. 예를 들어 상수 버퍼에 float myArray[2];
같은 항목을 갖는 것은 유효하지 않습니다. 루트 상수에 매핑되는 상수 버퍼 자체는 배열일 수 없습니다. 따라서 cbuffer myCBArray[2]
루트 상수에 매핑하는 것은 유효하지 않습니다.
상수는 부분적으로 설정할 수 있습니다. 예를 들어 루트 서명이 RootTableBindSlot 2에서 4개의 32비트 값을 정의하는 경우 4개 상수의 하위 집합을 한 번에 설정할 수 있습니다(나머지는 변경되지 않음). 이는 루트 서명 상태를 상속하고 부분적으로 변경할 수 있는 번들에 유용할 수 있습니다.
상수 설정 시 셰이더가 예상하는 상수 버퍼 레이아웃에 주의해야 합니다. 예를 들어 상수가 vec4
경계에 패딩될 수 있습니다. 필요한 레이아웃을 확인하려면 HLSL 셰이더에서 리플렉션 정보를 확인합니다.
다음 API(ID3D12GraphicsCommandList 인터페이스에서)는 루트 서명에서 직접 상수 설정을 위한 것입니다.
- SetGraphicsRoot32BitConstant
- SetGraphicsRoot32BitConstants
- SetComputeRoot32BitConstant
- SetComputeRoot32BitConstants
또한 D3D12_ROOT_CONSTANTS 구조를 참조하세요.
관련 항목