상태 개체

셰이더 모델 6.3 이상에서 애플리케이션은 Direct3D 12 API를 사용하는 것 외에도 HLSL 셰이더 코드에서 직접 DXR 상태 개체를 정의할 수 있는 편의성과 유연성을 제공합니다.

HLSL에서 상태 개체는 다음 구문을 통해 선언됩니다.

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
항목 Description
형식
하위object의 형식을 식별합니다. 지원되는 HLSL 하위object 형식 중 하나여야 합니다.
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
필드[1, 2, ...]
하위object의 필드입니다. 하위 필드의 각 유형에 대한 특정 필드는 아래에 설명되어 있습니다.

하위object 형식 목록:

StateObjectConfig

StateObjectConfig 하위object 형식은 D3D12_STATE_OBJECT_CONFIG 구조체에 해당합니다.

하나의 필드, 비트 플래그가 있으며, 둘 다 중 하나 또는 둘 다

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

또는 둘 다에 대해 0입니다.

예제:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature는 D3D12_GLOBAL_ROOT_SIGNATURE 구조체에 해당합니다.

필드는 루트 서명의 부분을 설명하는 몇 가지 문자열로 구성됩니다. 이에 대한 참조는 HLSL에서 루트 서명 지정을참조하세요.

예제:

GlobalRootSignature MyGlobalRootSignature =
{
    "DescriptorTable(UAV(u0)),"                     // Output texture
    "SRV(t0),"                                      // Acceleration structure
    "CBV(b0),"                                      // Scene constants
    "DescriptorTable(SRV(t1, numDescriptors = 2))"  // Static index and vertex buffers.
};

LocalRootSignature

LocalRootSignature는 D3D12_LOCAL_ROOT_SIGNATURE 구조체에 해당합니다.

전역 루트 서명 하위 필드와 마찬가지로 필드는 루트 서명의 일부를 설명하는 몇 가지 문자열로 구성됩니다. 이에 대한 참조는 HLSL에서 루트 서명 지정을참조하세요.

예제:

LocalRootSignature MyLocalRootSignature = 
{
    "RootConstants(num32BitConstants = 4, b1)"  // Cube constants 
};

SubobjectToExportsAssocation

기본적으로 내보내기와 동일한 라이브러리에 선언된 하위 구는 해당 내보내기에도 적용할 수 있습니다. 그러나 애플리케이션은 이를 재정의하고 어떤 하위 하위 항목이 어떤 내보내기와 함께 진행되는지에 대해 구체적으로 파악할 수 있습니다. HLSL에서 이 "명시적 연결"은 SubobjectToExportsAssocation을 사용하여 수행됩니다.

SubobjectToExportsAssocation은 D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION 구조체에 해당합니다.

이 하위 구문은 구문을 통해 선언됩니다.

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
항목 Description
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
SubobjectName
내보낸 하위object를 식별하는 문자열입니다.
수출
세미콜론으로 구분된 내보내기 목록을 포함하는 문자열입니다.

예제:

SubobjectToExportsAssociation MyLocalRootSignatureAssociation =
{
    "MyLocalRootSignature",    // Subobject name
    "MyHitGroup;MyMissShader"  // Exports association 
};

두 필드 모두 내보낸 이름을 사용합니다. 애플리케이션에서 내보내기-이름 바꾸기를 선택하는 경우 내보낸 이름은 HLSL의 원래 이름과 다를 수 있습니다.

RaytracingShaderConfig

RaytracingShaderConfig는 D3D12_RAYTRACING_SHADER_CONFIG 구조체에 해당합니다.

이 하위 구문은 구문을 통해 선언됩니다.

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
항목 Description
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
MaxPayloadSize
연결된 광선 추적 셰이더에 대한 광선 페이로드에서 스칼라의 최대 스토리지(각각 4바이트로 계산)에 대한 숫자 값입니다.
MaxAttributeSize
연결된 광선 추적 셰이더의 특성에 사용할 수 있는 최대 스칼라 수(각각 4바이트로 계산)의 숫자 값입니다. 값은 D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES초과할 수 없습니다.

예제:

RaytracingShaderConfig MyShaderConfig =
{
    16,  // Max payload size
    8    // Max attribute size
};

RaytracingPipelineConfig

RaytracingPipelineConfig는 D3D12_RAYTRACING_PIPELINE_CONFIG 구조체에 해당합니다.

이 하위 구문은 구문을 통해 선언됩니다.

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
항목 Description
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
MaxTraceRecursionDepth
광선 추적 파이프라인에서 광선 재귀에 사용할 숫자 제한입니다. 0에서 31 사이의 숫자입니다(포함).

예제:

RaytracingPipelineConfig MyPipelineConfig =
{
    1  // Max trace recursion depth
};

재귀 광선 추적에 성능 비용이 발생하므로 애플리케이션은 원하는 결과에 필요한 가장 낮은 재귀 깊이를 사용해야 합니다.

셰이더 호출이 최대 재귀 깊이에 아직 도달하지 않은 경우 TraceRay를 여러 번 호출할 수 있습니다. 그러나 최대 재귀 깊이에 도달하거나 최대 재귀 깊이를 초과하는 경우 TraceRay를 호출하면 디바이스가 제거된 상태로 전환됩니다. 따라서 광선 추적 셰이더가 최대 재귀 깊이를 충족하거나 초과하는 경우 TraceRay 호출을 중지하도록 주의해야 합니다.

TriangleHitGroup

TriangleHitGroup은 형식 필드가 D3D12_HIT_GROUP_TYPE_TRIANGLES 로 설정된 D3D12_HIT_GROUP_DESC구조체에 해당합니다.

이 하위 구문은 구문을 통해 선언됩니다.

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
항목 Description
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
AnyHitShader
적중 그룹 또는 빈 문자열에 대한 anyhit 셰이더의 문자열 이름입니다.
ClosestHitShader
적중 그룹의 가장 가까운 적중 셰이더 또는 빈 문자열의 문자열 이름입니다.

예제:

TriangleHitGroup MyHitGroup =
{
    "",                    // AnyHit
    "MyClosestHitShader",  // ClosestHit
};

두 필드 모두 내보낸 이름을 사용합니다. 애플리케이션에서 내보내기-이름 바꾸기를 선택하는 경우 내보낸 이름은 HLSL의 원래 이름과 다를 수 있습니다.

ProceduralPrimitiveHitGroup

ProceduralPrimitiveHitGroup은 형식 필드가 D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE로 설정 된 D3D12_HIT_GROUP_DESC 구조에 해당 합니다.

이 하위 개체는 구문을 사용 하 여 선언 됩니다.

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
항목 Description
이름의
변수 이름을 고유 하 게 식별 하는 ASCII 문자열입니다.
AnyHitShader
적중 그룹에 대 한 anyhit 셰이더의 문자열 이름 또는 빈 문자열입니다.
ClosestHitShader
적중 그룹에 대 한 가장 가까운 적중 셰이더의 문자열 이름 또는 빈 문자열입니다.
IntersectionShader
적중 그룹에 대 한 교차 셰이더의 문자열 이름 또는 빈 문자열입니다.

예제:

ProceduralPrimitiveHitGroup MyProceduralHitGroup
{
    "MyAnyHit",       // AnyHit
    "MyClosestHit",   // ClosestHit
    "MyIntersection"  // Intersection
};

세 필드는 내보낸 이름을 사용 합니다. 내보낸 이름은 응용 프로그램에서 내보내기-이름 바꾸기를 선택 하는 경우 HLSL의 원래 이름과 다를 수 있습니다.

설명

하위 개체의 개념은 "association" 또는 "어떤 하위 개체와 내보내기와 함께 이동"입니다.

셰이더 코드를 통해 하위 개체를 지정 하는 경우에는 DXR 사양에 설명 된 대로 규칙을 따르는 "하위 개체와 내보내기"를 선택 합니다. 특히 응용 프로그램에 내보내기가 있는 경우를 가정 합니다. 응용 프로그램이 응용 프로그램 코드를 통해 셰이더 코드 및 루트 서명 B를 통해 루트 서명 A를 사용 하 여 해당 내보내기를 연결 하는 경우 B는 사용 되는 항목입니다. "오류 생성" 대신 "사용 B"를 디자인 하면 응용 프로그램에서 응용 프로그램 코드를 사용 하 여 DXIL 연결을 간편 하 게 재정의할 수 있으므로 응용 프로그램 코드를 사용 하 여 일치 하지 않는 항목을 확인 하기 위해 강제로 다시 컴파일해야 합니다.

DirectX 개발자 블로그 게시물 "D3D12의 새로운 기능 – DirectX Raytracing (DXR) 이제 라이브러리 하위 기능을 지원 합니다."

DirectX Raytracing (DXR) 기능 사양

샘플: D3D12RaytracingLibrarySubobjects