Statusobjecten
Met shader-modellen 6.3 en hoger hebben toepassingen het gemak en de flexibiliteit om DXR-statusobjecten rechtstreeks in HLSL-shadercode te kunnen definiëren, naast het gebruik van Direct3D 12 API's.
In HLSL worden statusobjecten gedeclareerd met deze syntaxis:
Type Name =
{
Field1,
Field2,
...
};
Item | Beschrijving |
---|---|
Type |
Hiermee wordt het type subobject geïdentificeerd. Moet een van de ondersteunde HLSL-subobjecttypen zijn. |
naam |
Een ASCII-tekenreeks die de naam van de variabele uniek identificeert. |
veld[1, 2, ...] |
Velden van het subobject. Specifieke velden voor elk type subobject worden hieronder beschreven. |
Lijst met subobjecttypen:
- StateObjectConfig-
- GlobalRootSignature-
- LocalRootSignature-
- SubobjectToExportsAssocation
- RaytracingShaderConfig-
- RaytracingPipelineConfig-
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
StateObjectConfig
Het subobjecttype StateObjectConfig komt overeen met een D3D12_STATE_OBJECT_CONFIG structuur.
Het heeft één veld, een bitsgewijze vlag, een of beide van
- STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
- STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS
of nul voor geen van hen.
Voorbeeld:
StateObjectConfig MyStateObjectConfig =
{
STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};
GlobalRootSignature
Een GlobalRootSignature komt overeen met een D3D12_GLOBAL_ROOT_SIGNATURE structuur.
De velden bestaan uit een aantal tekenreeksen die de delen van de hoofdhandtekening beschrijven. Zie Root Signatures opgeven in HLSLvoor meer informatie hierover.
Voorbeeld:
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
Een LocalRootSignature komt overeen met een D3D12_LOCAL_ROOT_SIGNATURE structuur.
Net als het globale subobject voor de hoofdhandtekening bestaan de velden uit een aantal tekenreeksen die de onderdelen van de hoofdhandtekening beschrijven. Zie Root Signatures opgeven in HLSLvoor meer informatie hierover.
Voorbeeld:
LocalRootSignature MyLocalRootSignature =
{
"RootConstants(num32BitConstants = 4, b1)" // Cube constants
};
SubobjectToExportsAssocation
Standaard kan een subobject dat alleen in dezelfde bibliotheek is gedeclareerd als een export, worden toegepast op die export. Toepassingen hebben echter de mogelijkheid om dat te overschrijven en specifieke informatie te krijgen over welk subobject bij welke export gaat. In HLSL wordt deze 'expliciete koppeling' uitgevoerd met subobjectToExportsAssocation.
Een subobjectToExportsAssocation komt overeen met een D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION structuur.
Dit subobject wordt gedeclareerd met de syntaxis
SubobjectToExportsAssocation Name =
{
SubobjectName,
Exports
};
Item | Beschrijving |
---|---|
naam |
Een ASCII-tekenreeks die de naam van de variabele uniek identificeert. |
SubobjectName |
Tekenreeks waarmee een geëxporteerd subobject wordt geïdentificeerd. |
exports- |
Tekenreeks met een door puntkomma's gescheiden lijst met exports. |
Voorbeeld:
SubobjectToExportsAssociation MyLocalRootSignatureAssociation =
{
"MyLocalRootSignature", // Subobject name
"MyHitGroup;MyMissShader" // Exports association
};
Houd er rekening mee dat beide velden geëxporteerde namen gebruiken. Een geëxporteerde naam kan afwijken van de oorspronkelijke naam in HLSL als de toepassing ervoor kiest om de naam van export te wijzigen.
RaytracingShaderConfig
Een RaytracingShaderConfig komt overeen met een D3D12_RAYTRACING_SHADER_CONFIG structuur.
Dit subobject wordt gedeclareerd met de syntaxis
RaytracingShaderConfig Name =
{
MaxPayloadSize,
MaxAttributeSize
};
Item | Beschrijving |
---|---|
naam |
Een ASCII-tekenreeks die de naam van de variabele uniek identificeert. |
MaxPayloadSize- |
Numerieke waarde voor de maximale opslag voor scalaire waarden (elk geteld als 4 bytes) in raypayloads voor gekoppelde raytracing-shaders. |
MaxAttributeSize- |
Numerieke waarde voor het maximum aantal scalaire waarden (geteld als 4 bytes per stuk) dat kan worden gebruikt voor kenmerken in gekoppelde raytracing-shaders. De waarde mag niet groter zijn dan D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES. |
Voorbeeld:
RaytracingShaderConfig MyShaderConfig =
{
16, // Max payload size
8 // Max attribute size
};
RaytracingPipelineConfig
Een RaytracingPipelineConfig komt overeen met een D3D12_RAYTRACING_PIPELINE_CONFIG structuur.
Dit subobject wordt gedeclareerd met de syntaxis
RaytracingPipelineConfig Name =
{
MaxTraceRecursionDepth
};
Item | Beschrijving |
---|---|
naam |
Een ASCII-tekenreeks die de naam van de variabele uniek identificeert. |
MaxTraceRecursionDepth- |
Numerieke limiet die moet worden gebruikt voor ray-recursie in de raytracing-pijplijn. Het is een getal tussen 0 en 31, inclusief. |
Voorbeeld:
RaytracingPipelineConfig MyPipelineConfig =
{
1 // Max trace recursion depth
};
Omdat er prestatiekosten zijn voor raytracing-recursie, moeten toepassingen de laagste recursiediepte gebruiken die nodig is voor de gewenste resultaten.
Als shader-aanroepen de maximale recursiediepte nog niet hebben bereikt, kunnen ze TraceRay een willekeurig aantal keren aanroepen. Maar als ze de maximale recursiediepte bereiken of overschrijden, plaatst het aanroepen van TraceRay het apparaat in de status Verwijderd. Daarom moeten raytracing-shaders ervoor zorgen dat ze stoppen met het aanroepen van TraceRay als ze de maximale recursiediepte hebben bereikt of overschreden.
TriangleHitGroup
Een TriangleHitGroup komt overeen met een D3D12_HIT_GROUP_DESC structuur waarvan het veld Type is ingesteld op D3D12_HIT_GROUP_TYPE_TRIANGLES.
Dit subobject wordt gedeclareerd met de syntaxis
TriangleHitGroup Name =
{
AnyHitShader,
ClosestHitShader
};
Item | Beschrijving |
---|---|
naam |
Een ASCII-tekenreeks die de naam van de variabele uniek identificeert. |
AnyHitShader- |
Tekenreeksnaam van de anyhit-shader voor de hitgroep of een lege tekenreeks. |
ClosestHitShader- |
Tekenreeksnaam van de dichtstbijzijnde hit-shader voor de hitgroep of een lege tekenreeks. |
Voorbeeld:
TriangleHitGroup MyHitGroup =
{
"", // AnyHit
"MyClosestHitShader", // ClosestHit
};
Houd er rekening mee dat beide velden geëxporteerde namen gebruiken. Een geëxporteerde naam kan afwijken van de oorspronkelijke naam in HLSL als de toepassing ervoor kiest om de naam van export te wijzigen.
ProcedurePrimitiveHitGroup
Een ProcedurePrimitiveHitGroup komt overeen met een D3D12_HIT_GROUP_DESC structuur waarvan het veld Type is ingesteld op D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.
Dit subobject wordt gedeclareerd met de syntaxis
ProceduralPrimitiveHitGroup Name =
{
AnyHitShader,
ClosestHitShader,
IntersectionShader
};
Item | Beschrijving |
---|---|
naam |
Een ASCII-tekenreeks die de naam van de variabele uniek identificeert. |
AnyHitShader- |
Tekenreeksnaam van de anyhit-shader voor de hitgroep of een lege tekenreeks. |
ClosestHitShader- |
Tekenreeksnaam van de dichtstbijzijnde hit-shader voor de hitgroep of een lege tekenreeks. |
IntersectionShader- |
Tekenreeksnaam van de snijpunt-shader voor de hitgroep of een lege tekenreeks. |
Voorbeeld:
ProceduralPrimitiveHitGroup MyProceduralHitGroup
{
"MyAnyHit", // AnyHit
"MyClosestHit", // ClosestHit
"MyIntersection" // Intersection
};
Houd er rekening mee dat de drie velden geëxporteerde namen gebruiken. Een geëxporteerde naam kan afwijken van de oorspronkelijke naam in HLSL als de toepassing ervoor kiest om de naam van export te wijzigen.
Opmerkingen
Subobjecten hebben het begrip 'koppeling' of 'welk subobject met welke export gaat'.
Wanneer u subobjecten opgeeft via shader-code, volgt de keuze van 'welk subobject met welke export' de regels zoals beschreven in de DXR-specificatie. Stel dat een toepassing een export heeft. Als een toepassing die exporteert met hoofdhandtekening A via shader-code en basishandtekening B via toepassingscode, is B degene die wordt gebruikt. Het ontwerp van 'use B' in plaats van 'produce an error' biedt toepassingen de mogelijkheid om DXIL-koppelingen gemakkelijk te overschrijven met behulp van toepassingscode, in plaats van af te dwingen shaders opnieuw te compileren om niet-overeenkomende dingen op te lossen.