다음을 통해 공유


상태 개체

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

HLSL에서 상태 개체는 다음 구문을 사용하여 선언됩니다.

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

하위 개체 형식 목록:

StateObjectConfig

StateObjectConfig 하위 개체 형식은 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
};
항목 설명
Name
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
SubobjectName
내보낸 하위 개체를 식별하는 문자열입니다.
Exports
세미콜론으로 구분된 내보내기 목록을 포함하는 문자열입니다.

예제:

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

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

RaytracingShaderConfig

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

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

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
항목 설명
Name
변수 이름을 고유하게 식별하는 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
};
항목 설명
Name
변수 이름을 고유하게 식별하는 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
};
항목 설명
Name
변수 이름을 고유하게 식별하는 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
};
항목 설명
Name
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
AnyHitShader
적중 그룹의 anyhit 셰이더의 문자열 이름 또는 빈 문자열입니다.
ClosestHitShader
적중 그룹의 가장 가까운 적중 셰이더의 문자열 이름 또는 빈 문자열입니다.
IntersectionShader
적중 그룹의 교차 셰이더의 문자열 이름 또는 빈 문자열입니다.

예제:

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

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

설명

하위 개체에는 “연결” 또는 “어떤 하위 개체가 어떤 내보내기를 사용하는가”라는 개념이 있습니다.

셰이더 코드를 통해 하위 개체를 지정하는 경우 “어떤 하위 개체가 어떤 내보내기를 사용하는가”라는 선택은 DXR 사양에서 설명하는 규칙을 따릅니다. 특히 애플리케이션에 내보내기가 몇 개 있다고 가정해 보겠습니다. 애플리케이션이 내보내기를 셰이더 코드를 통해 루트 서명 A와 연결하고, 애플리케이션 코드를 통해 루트 서명 B와 연결하는 경우 사용되는 루트 서명은 B입니다. “오류 생성” 대신 “B 사용”을 디자인하면 애플리케이션은 일치하지 않는 문제를 해결하기 위해 셰이더를 다시 컴파일하도록 강요받지 않고 애플리케이션 코드를 사용하여 DXIL 연결을 편리하게 재정의할 수 있습니다.

DirectX 개발자 블로그 게시물 “D3D12의 새로운 기능 – DXR(DirectX Raytracing)이 이제 라이브러리 하위 개체 지원”

DirectX Raytracing(DXR) 기능 사양

샘플: D3D12RaytracingLibrarySubobjects