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
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
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.
Argomenti correlati
-
specifiche funzionali DirectX Raytracing (DXR)
esempio di : D3D12RaytracingLibrarySubobjects