Condividi tramite


Oggetti stato

Con i modelli shader 6.3 e versioni successive, le applicazioni hanno la praticità e la flessibilità di poter definire oggetti di stato DXR direttamente nel codice shader HLSL oltre all'uso delle API Direct3D 12.

In HLSL gli oggetti di stato vengono dichiarati con questa sintassi:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Elemento Descrizione
Digitare
Identifica il tipo di oggetto secondario. Deve essere uno dei tipi di subobject HLSL supportati.
Nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
Campo[1, 2, ...]
Campi del sottooggetto. Di seguito sono descritti campi specifici per ogni tipo di oggetto secondario.

Elenco di tipi subobject:

StateObjectConfig

Il tipo subobject StateObjectConfig corrisponde a una struttura D3D12_STATE_OBJECT_CONFIG .

Ha un campo, un flag bit per bit, che è uno o entrambi

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

o zero per nessuno di loro.

Esempio:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature corrisponde a una struttura D3D12_GLOBAL_ROOT_SIGNATURE .

I campi sono costituiti da alcuni numeri di stringhe che descrivono le parti della firma radice. Per informazioni di riferimento su questo argomento, vedere Specifica delle firme radice in HLSL.

Esempio:

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

LocalRootSignature corrisponde a una struttura D3D12_LOCAL_ROOT_SIGNATURE .

Analogamente al sottooggetto della firma radice globale, i campi sono costituiti da un certo numero di stringhe che descrivono le parti della firma radice. Per informazioni di riferimento su questo argomento, vedere Specifica delle firme radice in HLSL.

Esempio:

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

SubobjectToExportsAssocation

Per impostazione predefinita, un oggetto secondario semplicemente dichiarato nella stessa libreria di un'esportazione può essere applicato a tale esportazione. Tuttavia, le applicazioni hanno la possibilità di eseguire l'override di tale oggetto e ottenere informazioni specifiche sull'oggetto secondario con cui viene eseguito l'esportazione. In HLSL questa associazione esplicita viene eseguita usando SubobjectToExportsAssocation.

Un SubobjectToExportsAssocation corrisponde a una struttura D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .

Questo subobject viene dichiarato con la sintassi

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Elemento Descrizione
Nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
SubobjectName
Stringa che identifica un oggetto secondario esportato.
Esportazioni
Stringa contenente un elenco delimitato da punti e virgola delle esportazioni.

Esempio:

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

Si noti che entrambi i campi usano nomi esportati . Un nome esportato può essere diverso dal nome originale in HLSL, se l'applicazione sceglie di eseguire la ridenominazione dell'esportazione.

RaytracingShaderConfig

Un RaytracingShaderConfig corrisponde a una struttura D3D12_RAYTRACING_SHADER_CONFIG .

Questo subobject viene dichiarato con la sintassi

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Elemento Descrizione
Nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
MaxPayloadSize
Valore numerico per l'archiviazione massima per scalari (conteggiati come 4 byte ogni) in payload ray per gli shader raytrac associati.
MaxAttributeSize
Valore numerico per il numero massimo di scalari (conteggiati come 4 byte ogni) che possono essere usati per gli attributi negli shader raytracing associati. Il valore non può superare D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES.

Esempio:

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

RaytracingPipelineConfig

Un RaytracingPipelineConfig corrisponde a una struttura D3D12_RAYTRACING_PIPELINE_CONFIG .

Questo subobject viene dichiarato con la sintassi

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Elemento Descrizione
Nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
MaxTraceRecursionDepth
Limite numerico da usare per la ricorsione dei raggi nella pipeline di raytracing. È un numero compreso tra 0 e 31, inclusivo.

Esempio:

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

Poiché esiste un costo delle prestazioni per la ricorsione a raggi, le applicazioni devono usare la profondità di ricorsione più bassa necessaria per i risultati desiderati.

Se le chiamate shader non hanno ancora raggiunto la profondità massima di ricorsione, possono chiamare TraceRay qualsiasi numero di volte. Tuttavia, se raggiungono o superano la profondità massima di ricorsione, la chiamata a TraceRay inserisce il dispositivo nello stato rimosso. Pertanto, i raytracing shader devono prestare attenzione a interrompere la chiamata a TraceRay se hanno raggiunto o superato la profondità massima di ricorsione.

TriangolHitGroup

Un triangoloHitGroup corrisponde a una struttura D3D12_HIT_GROUP_DESC il cui campo Type è impostato su D3D12_HIT_GROUP_TYPE_TRIANGLES.

Questo subobject viene dichiarato con la sintassi

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Elemento Descrizione
Nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
AnyHitShader
Nome stringa del shader anyhit per il gruppo di hit o una stringa vuota.
ClosestHitShader
Nome stringa del hit shader più vicino per il gruppo di hit o una stringa vuota.

Esempio:

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

Si noti che entrambi i campi usano nomi esportati . Un nome esportato può essere diverso dal nome originale in HLSL, se l'applicazione sceglie di eseguire la ridenominazione dell'esportazione.

ProceduralPrimitiveHitGroup

Un oggetto ProceduralPrimitiveHitGroup corrisponde a una struttura D3D12_HIT_GROUP_DESC il cui campo Type è impostato su D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.

Questo subobject viene dichiarato con la sintassi

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Elemento Descrizione
Nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
AnyHitShader
Nome stringa del shader anyhit per il gruppo di hit o una stringa vuota.
ClosestHitShader
Nome stringa del hit shader più vicino per il gruppo di hit o una stringa vuota.
IntersezioneShader
Nome stringa del shader di intersezione per il gruppo di hit o stringa vuota.

Esempio:

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

Si noti che i tre campi usano nomi esportati . Un nome esportato può essere diverso dal nome originale in HLSL, se l'applicazione sceglie di eseguire la ridenominazione dell'esportazione.

Commenti

Gli oggetti secondari hanno la nozione di "associazione" o "quale subobject passa con quale esportazione".

Quando si specificano gli oggetti secondari tramite il codice shader, la scelta di "quale subobject passa con quale esportazione" segue le regole descritte nella specifica DXR. In particolare, si supponga che un'applicazione abbia un'esportazione. Se un'applicazione associa l'esportazione alla firma radice A tramite il codice shader e la firma radice B tramite il codice dell'applicazione, B è quella utilizzata. La progettazione di "usare B" anziché "produrre un errore" offre alle applicazioni la possibilità di eseguire l'override conveniente delle associazioni DXIL usando il codice dell'applicazione, anziché essere costretti a ricompilare gli shader per risolvere i problemi di mancata corrispondenza.

Post di blog per sviluppatori DirectX "New in D3D12 – DirectX Raytracing (DXR) ora supporta i subobject della libreria"

Specifiche funzionali directX Raytracing (DXR)

Esempio: D3D12RaytracingLibrarySubobjects