Share via


Zustandsobjekte

Mit Shadermodellen 6.3 und höher können Anwendungen neben Direct3D 12-APIs auch DXR-Zustandsobjekte direkt im HLSL-Shadercode definieren.

In HLSL werden Zustandsobjekte mit der folgenden Syntax deklariert:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Element Beschreibung
Typ
Gibt den Typ des Unterobjekts an. Muss einer der unterstützten HLSL-Unterobjekttypen sein.
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
Feld[1, 2, ...]
Felder des Unterobjekts. Spezifische Felder für jeden Unterobjekttyp werden unten 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 eines oder beides von ist.

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

oder, null für keines von ihnen.

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. Eine Referenz 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 Unterobjekt der Stammsignatur bestehen die Felder aus einer Reihe von Zeichenfolgen, die die Teile der Stammsignatur beschreiben. Eine Referenz 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 wird, auf diesen Export angewendet werden. Anwendungen haben jedoch die Möglichkeit, dies zu überschreiben und genau zu ermitteln, welches Unterobjekt mit welchem Export ausgeführt 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
};
Element Beschreibung
Namen
Eine ASCII-Zeichenfolge, die den Variablennamen eindeutig identifiziert.
SubobjectName
Zeichenfolge, die ein exportiertes Unterobjekt identifiziert.
Exportiert
Zeichenfolge mit einer durch Semikolon getrennten Liste von Exporten.

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 die Anwendung die Exportumbenennung durchführen möchte.

RaytracingShaderConfig

Eine RaytracingShaderConfig 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 Skalare (gezählt als jeweils 4 Bytes) in Raynutzlasten für zugeordnete Raytracing-Shader.
MaxAttributeSize
Numerischer Wert für die maximale Anzahl von Skalaren (gezählt als jeweils 4 Bytes), die für Attribute in zugeordneten Raytracing-Shadern verwendet werden können. Der Wert darf D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES nicht überschreiten.

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
Numerischer Grenzwert, der für die Raytracing-Rekursion in der Raytracingpipeline verwendet werden soll. Es ist eine Zahl zwischen 0 und 31, einschließlich.

Beispiel:

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

Da die Raytracingrekursion Leistungskosten verursacht, sollten Anwendungen die niedrigste Rekursionstiefe verwenden, die für die gewünschten Ergebnisse erforderlich ist.

Wenn Shaderaufrufe noch nicht die maximale Rekursionstiefe 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

Ein TriangleHitGroup-Objekt entspricht einer D3D12_HIT_GROUP_DESC-Struktur , deren Feld Typ auf D3D12_HIT_GROUP_TYPE_TRIANGLES festgelegt ist.

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
Der Zeichenfolgenname des nächstgelegenen Treffershaders 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 die Anwendung die Exportumbenennung durchführen möchte.

ProceduralPrimitiveHitGroup

Eine ProceduralPrimitiveHitGroup entspricht einer D3D12_HIT_GROUP_DESC-Struktur , deren Type-Feld auf D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE festgelegt 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
Der Zeichenfolgenname des nächstgelegenen Treffershaders für die Treffergruppe oder eine leere Zeichenfolge.
IntersectionShader
Zeichenfolgenname des Schnittpunkt-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 die Anwendung die Exportumbenennung durchführen möchte.

Bemerkungen

Unterobjekte haben den Begriff "Zuordnung" oder "welches Unterobjekt geht mit welchem Export ein".

Bei der Angabe von Unterobjekten über Shadercode folgt die Auswahl von "welches Unterobjekt mit welchem Export" den regeln, die in der DXR-Spezifikation beschrieben sind. Nehmen wir insbesondere an, eine Anwendung verfügt über einen Export. Wenn eine Anwendung dem Export der Stammsignatur A über Shadercode und Stammsignatur B über Anwendungscode zuordnet, wird B verwendet. Der Entwurf von "B verwenden" statt "Fehler erzeugen" gibt Anwendungen die Möglichkeit, DXIL-Zuordnungen mithilfe von Anwendungscode bequem zu überschreiben, anstatt gezwungen zu sein, Shader neu zu kompilieren, um nicht übereinstimmende Dinge zu beheben.

DirectX-Entwicklerblogbeitrag "Neu in D3D12 – DirectX Raytracing (DXR) unterstützt jetzt Bibliotheksunterobjekte"

DxR-Funktionsspezifikation (DirectX Raytracing)

Beispiel: D3D12RaytracingLibrarySubobjects