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
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProcedurálníPrimitiveHitGroup
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.