Statusobjekte

Mit Shadermodellen 6.3 und höher verfügen Anwendungen über die Einfachheit und Flexibilität, DXR-Zustandsobjekte zusätzlich zur Verwendung von Direct3D 12-APIs direkt im HLSL-Shadercode definieren zu können.

In HLSL werden Zustandsobjekte mit dieser Syntax deklariert:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Element Beschreibung
Typ
Identifiziert den Typ des Unterobjekts. Muss einer der unterstützten HLSL-Unterobjekttypen sein.
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
Field[1, 2, ...]
Felder des Unterobjekts. Im Folgenden werden bestimmte Felder für jeden Unterobjekttyp beschrieben.

Liste der Unterobjekttypen:

StateObjectConfig

Der StateObjectConfig-Unterobjekttyp entspricht einer D3D12_STATE_OBJECT_CONFIG Struktur.

Es verfügt über ein Feld, ein bitweises Flag, das ein oder beides von ist.

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

oder 0 (null) für keines von beiden.

Beispiel:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

Eine GlobalRootSignature entspricht einer D3D12_GLOBAL_ROOT_SIGNATURE Struktur.

Die Felder bestehen aus einer Reihe von Zeichenfolgen, die die Teile der Stammsignatur beschreiben. Weitere Informationen hierzu finden Sie unter Angeben von Stammsignaturen in HLSL.

Beispiel:

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

Eine LocalRootSignature entspricht einer D3D12_LOCAL_ROOT_SIGNATURE Struktur.

Genau wie das globale Stammsignatur-Unterobjekt bestehen die Felder aus einer Reihe von Zeichenfolgen, die die Teile der Stammsignatur beschreiben. Weitere Informationen hierzu finden Sie unter Angeben von Stammsignaturen in HLSL.

Beispiel:

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

SubobjectToExportsAssocation

Standardmäßig kann ein Unterobjekt, das lediglich in derselben Bibliothek wie ein Export deklariert ist, auf diesen Export angewendet werden. Anwendungen haben jedoch die Möglichkeit, dies zu überschreiben und genau zu erfahren, welches Unterobjekt mit welchem Export verwendet wird. In HLSL erfolgt diese "explizite Zuordnung" mithilfe von SubobjectToExportsAssocation.

Eine SubobjectToExportsAssocation entspricht einer D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION Struktur.

Dieses Unterobjekt wird mit der Syntax deklariert.

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Element Beschreibung
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
SubobjectName
Eine Zeichenfolge, die ein exportiertes Unterobjekt identifiziert.
Exportiert
Eine Zeichenfolge, die eine durch Semikolons getrennte Liste von Exporten enthält.

Beispiel:

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

Beachten Sie, dass beide Felder exportierte Namen verwenden. Ein exportierter Name kann sich vom ursprünglichen Namen in HLSL unterscheiden, wenn sich die Anwendung für das Umbenennen des Exports entscheidet.

RaytracingShaderConfig

Ein RaytracingShaderConfig-Wert entspricht einer D3D12_RAYTRACING_SHADER_CONFIG Struktur.

Dieses Unterobjekt wird mit der Syntax deklariert.

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Element Beschreibung
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
MaxPayloadSize
Numerischer Wert für den maximalen Speicher für Skalarwerte (jeweils 4 Byte) in Raynutzlasten für zugeordnete Raytracing-Shader.
MaxAttributeSize
Numerischer Wert für die maximale Anzahl von Skalaren (jeweils als 4 Byte gezählt), die für Attribute in zugeordneten Raytracing-Shadern verwendet werden können. Der Wert darf den Wert D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES.

Beispiel:

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

RaytracingPipelineConfig

Eine RaytracingPipelineConfig entspricht einer D3D12_RAYTRACING_PIPELINE_CONFIG Struktur.

Dieses Unterobjekt wird mit der Syntax deklariert.

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Element Beschreibung
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
MaxTraceRecursionDepth
Numerisches Limit, das für die Ray-Rekursion in der Raytracingpipeline verwendet werden soll. Dabei handelt es sich um eine Zahl zwischen 0 und 31 (einschließlich).

Beispiel:

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

Da für die Raytracing-Rekursion Leistungskosten entstehen, sollten Anwendungen die niedrigste Rekursionstiefe verwenden, die für die gewünschten Ergebnisse erforderlich ist.

Wenn Shaderaufrufe die maximale Rekursionstiefe noch nicht erreicht haben, können sie TraceRay so oft aufrufen. Wenn sie jedoch die maximale Rekursionstiefe erreichen oder überschreiten, versetzt der Aufruf von TraceRay das Gerät in den entfernten Zustand. Daher sollten Raytracing-Shader darauf achten, den Aufruf von TraceRay zu beenden, wenn sie die maximale Rekursionstiefe erreicht oder überschritten haben.

TriangleHitGroup

Eine TriangleHitGroup entspricht einer D3D12_HIT_GROUP_DESC-Struktur, deren Type-Feld auf D3D12_HIT_GROUP_TYPE_TRIANGLES.

Dieses Unterobjekt wird mit der Syntax deklariert.

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Element Beschreibung
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
AnyHitShader
Zeichenfolgenname des anyhit-Shaders für die Treffergruppe oder eine leere Zeichenfolge.
ClosestHitShader
Zeichenfolgenname des nächstgelegenen Treffer-Shaders für die Treffergruppe oder eine leere Zeichenfolge.

Beispiel:

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

Beachten Sie, dass beide Felder exportierte Namen verwenden. Ein exportierter Name kann sich vom ursprünglichen Namen in HLSL unterscheiden, wenn sich die Anwendung für das Umbenennen des Exports entscheidet.

ProceduralPrimitiveHitGroup

Eine ProceduralPrimitiveHitGroup entspricht einer D3D12_HIT_GROUP_DESC-Struktur, deren Type-Feld auf D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVEfestgelegt ist.

Dieses Unterobjekt wird mit der Syntax deklariert.

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Element Beschreibung
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
AnyHitShader
Zeichenfolgenname des Anyhit-Shaders für die Treffergruppe oder eine leere Zeichenfolge.
ClosestHitShader
Zeichenfolgenname des nächstgelegenen Treffer-Shaders für die Treffergruppe oder eine leere Zeichenfolge.
IntersectionShader
Zeichenfolgenname des Schnittmengen-Shaders für die Treffergruppe oder eine leere Zeichenfolge.

Beispiel:

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

Beachten Sie, dass die drei Felder exportierte Namen verwenden. Ein exportierter Name kann sich vom ursprünglichen Namen in HLSL unterscheiden, wenn sich die Anwendung für das Umbenennen des Exports entscheidet.

Hinweise

Unterobjekte haben das Konzept "zuordnung" oder "welches Unterobjekt mit welchem Export".

Bei der Angabe von Unterobjekten über Shadercode folgt die Auswahl von "welches Unterobjekt mit welchem Export" den Regeln, wie in der DXR-Spezifikationbeschrieben. Nehmen wir insbesondere an, dass eine Anwendung über einen Export verfügt. Wenn eine Anwendung den Export mit der Stammsignatur A über Shadercode und der Stammsignatur B über Anwendungscode zuweist, wird B verwendet. Der Entwurf von "Use B" anstelle von "produce an error" bietet Anwendungen die Möglichkeit, DXIL-Zuordnungen bequem mithilfe von Anwendungscode zu überschreiben, anstatt gezwungen zu werden, Shader neu zu kompilieren, um nicht übereinstimmende Dinge aufzulösen.

DirectX-Entwicklerblogbeitrag "New in D3D12 – DirectX Raytracing (DXR) now supports library subobjects" (Neu in D3D12 – DirectX Raytracing (DXR) unterstützt jetzt Bibliotheksunterobjekte)

DirectX Raytracing (DXR) – Funktionale Spezifikation

Beispiel: D3D12RaytracingLibrarySubobjects