Sdílet prostřednictvím


Stavové objekty

Díky modelům shaderu 6.3 a novějším mají aplikace kromě použití rozhraní API Direct3D 12 možnost definovat stavové objekty DXR přímo v kódu shaderu HLSL.

V HLSL jsou stavové objekty deklarovány pomocí této syntaxe:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Položka Popis
typ
Identifikuje typ podobjektu. Musí být jedním z podporovaných typů podobjektů HLSL.
názvu
Řetězec ASCII, který jednoznačně identifikuje název proměnné.
Pole[1; 2; ...]
Pole podobjektu Konkrétní pole pro každý typ podobjektu jsou popsána níže.

Seznam typů podobjektů:

StateObjectConfig

Typ dílčího objektu StateObjectConfig odpovídá struktuře D3D12_STATE_OBJECT_CONFIG.

Má jedno pole, bitový příznak, který je jeden nebo oba

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

nebo nula pro žádnou z nich.

Příklad:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature odpovídá D3D12_GLOBAL_ROOT_SIGNATURE struktuře.

Pole se skládají z určitého počtu řetězců popisujících části kořenového podpisu. Referenční informace najdete v tématu Určení kořenových podpisů v HLSL.

Příklad:

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 odpovídá D3D12_LOCAL_ROOT_SIGNATURE struktuře.

Stejně jako globální podobjekt kořenového podpisu se pole skládají z určitého počtu řetězců popisujících části kořenového podpisu. Referenční informace najdete v tématu Určení kořenových podpisů v HLSL.

Příklad:

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

SubobjectToExportsAssocation

Ve výchozím nastavení je u daného exportu možné použít pouze podobjekt deklarovaný ve stejné knihovně jako export. Aplikace ale mají možnost přepsat to a získat konkrétní informace o tom, s jakým podobjektem jde s exportem. V HLSL se toto explicitní přidružení provádí pomocí subobjectToExportsAssocation.

SubobjectToExportsAssocation odpovídá D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION struktuře.

Tento podobjekt je deklarován syntaxí.

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Položka Popis
názvu
Řetězec ASCII, který jednoznačně identifikuje název proměnné.
SubobjectName
Řetězec, který identifikuje exportovaný podobjekt.
exporty
Řetězec obsahující seznam exportů oddělených středníkem.

Příklad:

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

Všimněte si, že obě pole používají exportovaných názvů. Exportovaný název se může lišit od původního názvu v HLSL, pokud se aplikace rozhodne provést přejmenování exportu.

RaytracingShaderConfig

RaytracingShaderConfig odpovídá D3D12_RAYTRACING_SHADER_CONFIG struktuře.

Tento podobjekt je deklarován syntaxí.

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Položka Popis
názvu
Řetězec ASCII, který jednoznačně identifikuje název proměnné.
MaxPayloadSize
Číselná hodnota maximálního úložiště skalárů (počítáno jako 4 bajty každý) v datových částech paprsků pro přidružené shadery raytracing.
MaxAttributeSize
Číselná hodnota maximálního počtu skalárů (počítáno jako každý ze 4 bajtů), které lze použít pro atributy v přidružených shaderech raytracing. Hodnota nesmí překročit D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES.

Příklad:

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

RaytracingPipelineConfig

A RaytracingPipelineConfig odpovídá D3D12_RAYTRACING_PIPELINE_CONFIG struktuře.

Tento podobjekt je deklarován syntaxí.

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Položka Popis
názvu
Řetězec ASCII, který jednoznačně identifikuje název proměnné.
MaxTraceRecursionDepth
Číselný limit, který se má použít pro rekurze paprsku v kanálu raytracingu. Jedná se o číslo v rozsahu od 0 do 31 včetně.

Příklad:

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

Vzhledem k tomu, že při rekurzi raytrace existují náklady na výkon, měly by aplikace použít nejnižší hloubku rekurze potřebnou pro požadované výsledky.

Pokud vyvolání shaderu ještě nedosáhlo maximální hloubky rekurze, mohou volat TraceRay libovolný počet. Pokud ale dosáhnou nebo překročí maximální rekurzivní hloubku, volání TraceRay umístí zařízení do odebraného stavu. Proto by raytracing shadery měly dbát na to, aby přestaly volat TraceRay, pokud byly splněny nebo překročily maximální rekurzivní hloubku.

TriangleHitGroup

A TriangleHitGroup odpovídá D3D12_HIT_GROUP_DESC struktury, jejíž pole Typ je nastaveno na D3D12_HIT_GROUP_TYPE_TRIANGLES.

Tento podobjekt je deklarován syntaxí.

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Položka Popis
názvu
Řetězec ASCII, který jednoznačně identifikuje název proměnné.
AnyHitShader
Název řetězce shaderu anyhit pro skupinu přístupů nebo prázdný řetězec.
ClosestHitShader
Název řetězce nejbližšího shaderu hitů pro skupinu přístupů nebo prázdný řetězec.

Příklad:

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

Všimněte si, že obě pole používají exportovaných názvů. Exportovaný název se může lišit od původního názvu v HLSL, pokud se aplikace rozhodne provést přejmenování exportu.

ProcedurálníPrimitiveHitGroup

A ProceduralPrimitiveHitGroup odpovídá D3D12_HIT_GROUP_DESC struktury, jejíž pole Typ je nastaveno na D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.

Tento podobjekt je deklarován syntaxí.

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Položka Popis
názvu
Řetězec ASCII, který jednoznačně identifikuje název proměnné.
AnyHitShader
Název řetězce shaderu anyhit pro skupinu přístupů nebo prázdný řetězec.
ClosestHitShader
Název řetězce nejbližšího shaderu hitů pro skupinu přístupů nebo prázdný řetězec.
průsečíku
Název řetězce shaderu průniku pro skupinu přístupů nebo prázdný řetězec.

Příklad:

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

Všimněte si, že tři pole používají exportovaných názvů. Exportovaný název se může lišit od původního názvu v HLSL, pokud se aplikace rozhodne provést přejmenování exportu.

Poznámky

Podobjekty mají pojem "asociace" nebo "který podobjekt jde s exportem".

Při zadávání podobjektů prostřednictvím kódu shaderu se volba "který podobjekt přechází s exportem" řídí pravidly popsanými ve specifikaci DXR. Předpokládejme zejména, že aplikace má nějaký export. Pokud aplikace přidruží export k kořenovému podpisu A prostřednictvím shaderu kódu a kořenového podpisu B prostřednictvím kódu aplikace, B je ten, který se použije. Návrh "use B" místo "vytvořit chybu" dává aplikacím možnost pohodlně přepsat přidružení DXIL pomocí kódu aplikace, místo aby bylo nutné překompilovat shadery, aby se vyřešily neshody.

blogový příspěvek pro vývojáře DirectX "New in D3D12 – DirectX Raytracing (DXR) now supports library subobjects"

funkční specifikace DirectX Raytracing (DXR)

Ukázka : D3D12RaytracingLibrarySubobjects