Différences par rapport à DXR sur Windows
Lors de la création d’une signature racine globale, un indicateur supplémentaire doit être défini dans la description de la signature racine : D3D12XBOX_ROOT_SIGNATURE_FLAG_RAYTRACING. Cet indicateur ne peut actuellement pas être défini dans une signature racine spécifiée en langage de nuanceur de haut niveau (HLSL) et doit être défini dans le code avant la sérialisation de la signature racine. XDXR ne prend pas entièrement en charge la fonctionnalité RayQuery.TraceRayInline() de DXR 1.1; toutefois, nous fournissons un fichier d’en-tête (XDXRStandaloneTraverse) qui imite l’API RayQuery et devrait permettre un portage très simple pour la plupart du code RayQuery. Les différences particulières sont indiquées dans Parcours autonome XDXR. XDXR ne prend actuellement pas en chargeRAY_FLAG_SKIP_TRIANGLES, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES ni le système D3D12_RAYTRACING_PIPELINE_FLAGS. Cela pourrait être revu à l’avenir. Actuellement, les constructions de TLAS par lots peuvent être extrêmement rapides sur XBOX, et la construction de TLAS distinctes dans ce cas offrira de meilleures performances de parcours que le fait d’ignorer les nœuds.
XDXR prend en charge plusieurs extensions permettant d’interroger l’état directement à partir du BVH ou du parcours, sans avoir à utiliser les données de charge utile pour le stockage.
Pour utiliser ces extensions, déclarez à l’avance une ou plusieurs des fonctions suivantes en haut de votre nuanceur de lancer de rayons.
Conception de XDXR
À un niveau élevé, l’implémentation de XDXR peut être considérée comme divisée en deux parties : un cœur de parcours (Traversal Core) et le « planificateur » (Scheduler).Cœurs de parcours
Un cœur de parcours est l’implémentation du parcours de la hiérarchie de volumes englobants (BVH) de XDXR. Il est responsable de la gestion du parcours et des décisions de haut niveau, comme le choix des nuanceurs (par exemple, closest-hit et any-hit) à appeler. Il ne s’occupe pas des mécanismes réels d’appel du nuanceur. Cela relève du planificateur. XDXR utilise une représentation BVH4 pour stocker ses structures d’accélération. Bien que d’autres formats de BVH auraient pu être choisis, ce format correspond à celui pour lequel XBOX Series X|S dispose de matériel personnalisé permettant d’effectuer des tests d’intersection rayon/boîte englobante alignée sur les axes (AABB). Pour plus de détails, consultez Conception matérielle du lancer de rayons.Parcours
XDXR n’implémente actuellement aucune forme de réempaquetage, de tri ou de réorganisation des rayons. Dès qu’un nuanceur de génération de rayons est appelé, tout thread qui ne trace pas activement un rayon est une « voie inactive » dans la vague et gaspille des occasions d’effectuer du travail utile. Conceptuellement, un rayon est créé sur un thread donné. Tous les appels subséquents de nuanceurs ou de rayons récursifs résident sur ce même thread. Si un nuanceur de génération de rayons crée deux rayons sur la voie 0 et aucun rayon sur toutes les autres voies d’une vague, le thread 0 doit terminer séquentiellement ses deux rayons pendant que tous les autres threads restent inactifs. XDXR expose actuellement deux algorithmes de parcours de BVH. L’algorithme par défaut s’appelle parcours « divergent » (Divergent) et constitue la solution la plus générique, adaptée aux charges de travail divergentes comme les réflexions brillantes. PourTraceRayInline(), l’en-tête équivalent est XDXRStandaloneTraverseShortStack.hlsli. Pour les charges de travail très cohérentes, comme les rayons d’ombre ou les réflexions non brillantes, le GDK de juin 2022 fournit un nouvel algorithme de parcours « hybride » (Hybrid). Cet algorithme effectue le parcours de la TLAS au moyen de branchements scalaires et ne diverge qu’à l’entrée d’une BLAS. Le parcours hybride peut offrir des performances considérablement améliorées pour certains contenus et certaines charges de travail de lancer de rayons.
Pour activer le parcours « hybride », ajoutez XBOX_RAY_FLAG_COHERENT_RAYS_HINT aux indicateurs de rayon de votre TraceRay() DXR 1.0. Les indicateurs de rayon et le pointeur de TLAS doivent être uniformes pour activer ce type de parcours. Pour TraceRayInline(), l’en-tête équivalent est XDXRStandaloneTraverseHT.hlsli.
