Objets d’état
Avec les modèles de nuanceur 6.3 et versions ultérieures, les applications ont la commodité et la flexibilité de pouvoir définir des objets d’état DXR directement dans le code de nuanceur HLSL en plus d’utiliser les API Direct3D 12.
Dans HLSL, les objets d’état sont déclarés avec la syntaxe suivante :
Type Name =
{
Field1,
Field2,
...
};
Élément | Description |
---|---|
Type |
Identifie le type de sous-objet. Doit être l’un des types de sous-objets HLSL pris en charge. |
Nom |
Chaîne ASCII qui identifie de manière unique le nom de la variable. |
Champ[1, 2, ...] |
Champs du sous-objet. Les champs spécifiques pour chaque type de sous-objet sont décrits ci-dessous. |
Liste des types de sous-objets :
- StateObjectConfig
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
StateObjectConfig
Le type de sous-objet StateObjectConfig correspond à une structure D3D12_STATE_OBJECT_CONFIG .
Il a un champ, un indicateur au niveau du bit, qui est l’un ou les deux de
- STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
- STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS
ou zéro pour ni l’un ni l’autre.
Exemple :
StateObjectConfig MyStateObjectConfig =
{
STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};
GlobalRootSignature
Un GlobalRootSignature correspond à une structure D3D12_GLOBAL_ROOT_SIGNATURE .
Les champs se composent d’un certain nombre de chaînes décrivant les parties de la signature racine. Pour plus d’informations à ce sujet, consultez Spécification de signatures racines dans HLSL.
Exemple :
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
Un LocalRootSignature correspond à une structure D3D12_LOCAL_ROOT_SIGNATURE .
Tout comme le sous-objet de signature racine globale, les champs se composent d’un certain nombre de chaînes décrivant les parties de la signature racine. Pour plus d’informations à ce sujet, consultez Spécification de signatures racines dans HLSL.
Exemple :
LocalRootSignature MyLocalRootSignature =
{
"RootConstants(num32BitConstants = 4, b1)" // Cube constants
};
SubobjectToExportsAssocation
Par défaut, un sous-objet simplement déclaré dans la même bibliothèque qu’une exportation peut s’appliquer à cette exportation. Toutefois, les applications ont la possibilité de remplacer cela et d’obtenir des informations spécifiques sur le sous-objet associé à l’exportation. Dans HLSL, cette « association explicite » s’effectue à l’aide de SubobjectToExportsAssocation.
Un SubobjectToExportsAssocation correspond à une structure D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .
Ce sous-objet est déclaré avec la syntaxe
SubobjectToExportsAssocation Name =
{
SubobjectName,
Exports
};
Élément | Description |
---|---|
Nom |
Chaîne ASCII qui identifie de manière unique le nom de la variable. |
Sous-objetName |
Chaîne qui identifie un sous-objet exporté. |
Exportations |
Chaîne contenant une liste d’exportations délimitée par des points-virgules. |
Exemple :
SubobjectToExportsAssociation MyLocalRootSignatureAssociation =
{
"MyLocalRootSignature", // Subobject name
"MyHitGroup;MyMissShader" // Exports association
};
Notez que les deux champs utilisent des noms exportés . Un nom exporté peut être différent du nom d’origine dans HLSL, si l’application choisit d’effectuer un changement de nom d’exportation.
RaytracingShaderConfig
Un RaytracingShaderConfig correspond à une structure D3D12_RAYTRACING_SHADER_CONFIG .
Ce sous-objet est déclaré avec la syntaxe
RaytracingShaderConfig Name =
{
MaxPayloadSize,
MaxAttributeSize
};
Élément | Description |
---|---|
Nom |
Chaîne ASCII qui identifie de manière unique le nom de la variable. |
MaxPayloadSize |
Valeur numérique pour le stockage maximal pour les scalaires (comptés comme 4 octets chacun) dans les charges utiles de rayon pour les nuanceurs de raytracing associés. |
MaxAttributeSize |
Valeur numérique pour le nombre maximal de scalaires (comptés en 4 octets chacun) qui peuvent être utilisés pour les attributs dans les nuanceurs de raytracing associés. La valeur ne peut pas dépasser D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES. |
Exemple :
RaytracingShaderConfig MyShaderConfig =
{
16, // Max payload size
8 // Max attribute size
};
RaytracingPipelineConfig
Un RaytracingPipelineConfig correspond à une structure D3D12_RAYTRACING_PIPELINE_CONFIG .
Ce sous-objet est déclaré avec la syntaxe
RaytracingPipelineConfig Name =
{
MaxTraceRecursionDepth
};
Élément | Description |
---|---|
Nom |
Chaîne ASCII qui identifie de manière unique le nom de la variable. |
MaxTraceRecursionDepth |
Limite numérique à utiliser pour la récursivité des rayons dans le pipeline de raytracing. Il s’agit d’un nombre compris entre 0 et 31, inclus. |
Exemple :
RaytracingPipelineConfig MyPipelineConfig =
{
1 // Max trace recursion depth
};
Étant donné qu’il existe un coût de performances pour la récursivité du raytracing, les applications doivent utiliser la profondeur de récursion la plus faible nécessaire pour obtenir les résultats souhaités.
Si les appels de nuanceur n’ont pas encore atteint la profondeur de récursivité maximale, ils peuvent appeler TraceRay n’importe quel nombre de fois. Mais s’ils atteignent ou dépassent la profondeur de récursion maximale, l’appel de TraceRay place l’appareil dans un état supprimé. Par conséquent, les nuanceurs de raytracing doivent prendre soin d’arrêter d’appeler TraceRay s’ils ont atteint ou dépassé la profondeur de récursion maximale.
TriangleHitGroup
Un TriangleHitGroup correspond à une structure D3D12_HIT_GROUP_DESC dont le champ Type est défini sur D3D12_HIT_GROUP_TYPE_TRIANGLES.
Ce sous-objet est déclaré avec la syntaxe
TriangleHitGroup Name =
{
AnyHitShader,
ClosestHitShader
};
Élément | Description |
---|---|
Nom |
Chaîne ASCII qui identifie de manière unique le nom de la variable. |
AnyHitShader |
Nom de chaîne du nuanceur anyhit pour le groupe d’accès, ou une chaîne vide. |
ClosestHitShader |
Nom de chaîne du nuanceur d’accès le plus proche pour le groupe d’accès, ou une chaîne vide. |
Exemple :
TriangleHitGroup MyHitGroup =
{
"", // AnyHit
"MyClosestHitShader", // ClosestHit
};
Notez que les deux champs utilisent des noms exportés . Un nom exporté peut être différent du nom d’origine dans HLSL, si l’application choisit d’effectuer un changement de nom d’exportation.
ProceduralPrimitiveHitGroup
Un proceduralPrimitiveHitGroup correspond à une structure D3D12_HIT_GROUP_DESC dont le champ Type est défini sur D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.
Ce sous-objet est déclaré avec la syntaxe
ProceduralPrimitiveHitGroup Name =
{
AnyHitShader,
ClosestHitShader,
IntersectionShader
};
Élément | Description |
---|---|
Nom |
Chaîne ASCII qui identifie de façon unique le nom de la variable. |
AnyHitShader |
Nom de chaîne du nuanceur anyhit pour le groupe d’accès, ou une chaîne vide. |
ClosestHitShader |
Nom de chaîne du nuanceur de correspondance le plus proche pour le groupe d’accès, ou une chaîne vide. |
IntersectionShader |
Nom de chaîne du nuanceur d’intersection pour le groupe d’accès, ou une chaîne vide. |
Exemple :
ProceduralPrimitiveHitGroup MyProceduralHitGroup
{
"MyAnyHit", // AnyHit
"MyClosestHit", // ClosestHit
"MyIntersection" // Intersection
};
Notez que les trois champs utilisent des noms exportés . Un nom exporté peut être différent du nom d’origine dans HLSL si l’application choisit d’effectuer un changement de nom d’exportation.
Notes
Les sous-objets ont la notion d'« association », ou « quel sous-objet va avec quelle exportation ».
Lorsque vous spécifiez des sous-objets par le biais du code du nuanceur, le choix de « quel sous-objet va avec quelle exportation » suit les règles décrites dans la spécification DXR. En particulier, supposons qu’une application dispose d’une exportation. Si une application associe cette exportation à la signature racine A par le biais du nuanceur-code et de la signature racine B par le code d’application, B est celle qui est utilisée. La conception de « utiliser B » au lieu de « produire une erreur » donne aux applications la possibilité de remplacer facilement les associations DXIL à l’aide du code d’application, plutôt que d’être obligées de recompiler des nuanceurs pour résoudre les problèmes de correspondance.