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
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangolHitGroup
- ProceduralPrimitiveHitGroup
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.