Freigeben über


State-Objekte

Mit Shadermodellen 6.3 und höher haben Anwendungen den Komfort und die Flexibilität, DXR-Zustandsobjekte zusätzlich zur Verwendung von Direct3D 12-APIs direkt im HLSL-Shadercode zu definieren.

In HLSL werden Zustandsobjekte mit dieser Syntax deklariert:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Artikel Beschreibung
Typ
Gibt den Typ des Unterobjekts an. Muss einer der unterstützten HLSL-Unterobjekttypen sein.
Name
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
Feld[1, 2, ...]
Felder des Unterobjekts. Bestimmte Felder für jeden Unterobjekttyp werden unten beschrieben.

Liste der Unterobjekttypen:

StateObjectConfig

Der StateObjectConfig-Unterobjekttyp entspricht einer D3D12_STATE_OBJECT_CONFIG Struktur.

Es hat ein Feld, ein bitweises Kennzeichen, das eine oder beides ist

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

oder null für beide.

Beispiel:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

Ein 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

Ein LocalRootSignature entspricht einer D3D12_LOCAL_ROOT_SIGNATURE Struktur.

Genau wie das globale Unterobjekt der Stammsignatur 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 nur in derselben Bibliothek wie ein Export deklariert wurde, auf diesen Export angewendet werden. Anwendungen haben jedoch die Möglichkeit, dies außer Kraft zu setzen und spezifische Informationen darüber zu erhalten, welches Unterobjekt mit welchem Export verwendet wird. In HLSL erfolgt diese "explizite Zuordnung" mithilfe von SubobjectToExportsAssocation.

Ein SubobjectToExportsAssocation entspricht einer D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION Struktur.

Dieses Unterobjekt wird mit der Syntax deklariert.

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Artikel Beschreibung
Name
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
SubobjectName-
Zeichenfolge, die ein exportiertes Unterobjekt identifiziert.
Exporte
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 exportierten Namen verwenden. Ein exportierter Name kann sich von dem ursprünglichen Namen in HLSL unterscheiden, wenn sich die Anwendung für die Exportbenennung entscheidet.

RaytracingShaderConfig

Ein RaytracingShaderConfig entspricht einer D3D12_RAYTRACING_SHADER_CONFIG Struktur.

Dieses Unterobjekt wird mit der Syntax deklariert.

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Artikel Beschreibung
Name
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
MaxPayloadSize-
Numerischer Wert für den maximalen Speicher für Skalar (jeweils als 4 Byte gezählt) 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 D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTESnicht überschreiten.

Beispiel:

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

RaytracingPipelineConfig

Ein RaytracingPipelineConfig entspricht einer D3D12_RAYTRACING_PIPELINE_CONFIG Struktur.

Dieses Unterobjekt wird mit der Syntax deklariert.

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Artikel Beschreibung
Name
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
MaxTraceRecursionDepth-
Numerische Grenze, die für die Rayrekursion in der Raytracing-Pipeline verwendet werden soll. Es handelt sich um eine Zahl zwischen 0 und 31 einschließlich.

Beispiel:

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

Da es eine Leistungskosten für die Raytracing-Rekursion gibt, sollten Anwendungen die niedrigste Rekursionstiefe verwenden, die für die gewünschten Ergebnisse benötigt wird.

Wenn Shaderaufrufe die maximale Rekursionstiefe noch nicht erreicht haben, können sie TraceRay- beliebig 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_TRIANGLESfestgelegt ist.

Dieses Unterobjekt wird mit der Syntax deklariert.

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Artikel Beschreibung
Name
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 Treffershaders für die Treffergruppe oder eine leere Zeichenfolge.

Beispiel:

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

Beachten Sie, dass beide Felder exportierten Namen verwenden. Ein exportierter Name kann sich von dem ursprünglichen Namen in HLSL unterscheiden, wenn sich die Anwendung für die Exportbenennung 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
};
Artikel Beschreibung
Name
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 Treffershaders 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 exportierten Namen verwenden. Ein exportierter Name kann sich von dem ursprünglichen Namen in HLSL unterscheiden, wenn sich die Anwendung für die Exportbenennung entscheidet.

Bemerkungen

Unterobjekte haben den Begriff "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 folgt, wie in der DXR-Spezifikationbeschrieben. Nehmen wir insbesondere an, dass eine Anwendung einen Export hat. Wenn eine Anwendung diesen Export mit der Stammsignatur A über Shadercode und Stammsignatur B über Anwendungscode zuordnet, ist B die Anwendung, die verwendet wird. Der Entwurf von "Use B" anstelle von "Erzeugen eines Fehlers" ermöglicht Anwendungen die Möglichkeit, DXIL-Zuordnungen mithilfe von Anwendungscode bequem außer Kraft zu setzen, anstatt gezwungen zu sein, shader neu zu kompilieren, um Nichtübereinstimmungen zu beheben.

DirectX Developer Blogbeitrag "Neu in D3D12 – DirectX Raytracing (DXR) unterstützt jetzt Bibliotheksunterobjekte"

DirectX Raytracing (DXR) Functional Spec

Beispiel: D3D12RaytracingLibrarySubobjects