Delen via


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

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.

DirectX Developer Blog post "New in D3D12 – DirectX Raytracing (DXR) now supports library subobjects"

DirectX Raytracing (DXR) Functionele specificatie

voorbeeld: D3D12RaytracingLibrarySubobjects