다음을 통해 공유


상태 개체

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

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

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
항목 묘사
형식
하위 개체의 형식을 식별합니다. 지원되는 HLSL 하위 개체 형식 중 하나여야 합니다.
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
필드[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
};
항목 묘사
이름
변수 이름을 고유하게 식별하는 ASCII 문자열입니다.
SubobjectName
내보낸 하위 개체를 식별하는 문자열입니다.
내보내기
세미콜론으로 구분된 내보내기 목록을 포함하는 문자열입니다.

본보기:

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

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

RaytracingShaderConfig

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

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

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

본보기:

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

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

발언

하위 개체에는 "연결" 또는 "어떤 하위 개체가 내보내는지"라는 개념이 있습니다.

셰이더 코드를 통해 하위 개체를 지정할 때 "내보낼 하위 개체"를 선택하는 것은 DXR 사양설명된 대로 규칙을 따릅니다. 특히 애플리케이션에 내보내기가 있다고 가정합니다. 애플리케이션이 애플리케이션 코드를 통해 셰이더 코드 및 루트 서명 B를 통해 루트 서명 A와 내보내기를 연결하는 경우 B는 사용됩니다. "오류 생성" 대신 "B 사용"을 디자인하면 애플리케이션이 불일치를 해결하기 위해 셰이더를 다시 컴파일하도록 강제하지 않고 애플리케이션 코드를 사용하여 DXIL 연결을 편리하게 재정의할 수 있습니다.

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

DXR(DirectX Raytracing) 기능 사양

샘플: D3D12RaytracingLibrarySubobjects