Condividi tramite


Oggetti stato

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

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

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Articolo Descrizione
tipo
Identifica il tipo di oggetto secondario. Deve essere uno dei tipi di oggetto secondario 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 di oggetto secondario:

StateObjectConfig

Il tipo di oggetto secondario 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 un certo numero di stringhe che descrivono le parti della firma radice. Per informazioni di riferimento, 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, 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 e ottenere informazioni specifiche sul sottooggetto che va con quale esportazione. In HLSL questa "associazione esplicita" viene eseguita usando SubobjectToExportsAssocation.

Un SubobjectToExportsAssocation corrisponde a una struttura D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .

Questo sottooggetto viene dichiarato con la sintassi

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Articolo Descrizione
nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
SubobjectName
Stringa che identifica un sottooggetto esportato.
esportazioni
Stringa contenente un elenco di esportazioni delimitato da punto e virgola.

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

RaytracingShaderConfig corrisponde a una struttura D3D12_RAYTRACING_SHADER_CONFIG.

Questo sottooggetto viene dichiarato con la sintassi

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Articolo Descrizione
nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
MaxPayloadSize
Valore numerico per l'archiviazione massima per i scalari (conteggiati come 4 byte ciascuno) nei payload ray per gli shader raytracing associati.
MaxAttributeSize
Valore numerico per il numero massimo di scalari (conteggiati come 4 byte ciascuno) 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 sottooggetto viene dichiarato con la sintassi

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Articolo Descrizione
nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
maxTraceRecursionDepth
Limite numerico da usare per la ricorsione ray nella pipeline di raytracing. È un numero compreso tra 0 e 31 inclusi.

Esempio:

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

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

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

TriangleHitGroup

Un oggetto TriangleHitGroup corrisponde a una struttura D3D12_HIT_GROUP_DESC il cui campo Tipo è impostato su D3D12_HIT_GROUP_TYPE_TRIANGLES.

Questo sottooggetto viene dichiarato con la sintassi

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Articolo Descrizione
nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
AnyHitShader
Nome stringa dello shader anyhit per il gruppo di passaggi o stringa vuota.
ClosestHitShader
Nome stringa dello shader di hit più vicino per il gruppo di passaggi 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

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

Questo sottooggetto viene dichiarato con la sintassi

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Articolo Descrizione
nome
Stringa ASCII che identifica in modo univoco il nome della variabile.
AnyHitShader
Nome stringa dello shader anyhit per il gruppo di passaggi o stringa vuota.
ClosestHitShader
Nome stringa dello shader di hit più vicino per il gruppo di passaggi o una stringa vuota.
'intersezioneShader
Nome stringa dello shader di intersezione per il gruppo di passaggi 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.

Osservazioni

Gli oggetti secondari hanno la nozione di "associazione" o "quale sottooggetto va con quale esportazione".

Quando si specificano oggetti secondari tramite codice shader, la scelta di "quale sottooggetto 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 usata. La progettazione di "usare B" invece di "produrre un errore" offre alle applicazioni la possibilità di eseguire facilmente l'override delle associazioni DXIL usando il codice dell'applicazione, anziché essere costretti a ricompilare gli shader per risolvere gli elementi non corrispondenti.

post di blog per sviluppatori DirectX "New in D3D12 – DirectX Raytracing (DXR) now supports library subobjects"

specifiche funzionali DirectX Raytracing (DXR)

esempio di : D3D12RaytracingLibrarySubobjects