Différences avec 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 HLSL (High-Level Shader Language) 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 ; nous fournissons toutefois 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 spécifiques sont indiquées dans XDXR Standalone Traverse. XDXR ne prend actuellement pas en chargeRAY_FLAG_SKIP_TRIANGLES, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES ni le système D3D12_RAYTRACING_PIPELINE_FLAGS. Cela pourra être révisé à 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 des 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 (payload) pour le stockage.
Pour utiliser ces extensions, déclarez à l’avance une ou plusieurs des fonctions suivantes en haut de votre shader de raytracing.
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 « Scheduler » (planificateur).Cœurs de parcours
Un cœur de parcours est l’implémentation du parcours de la hiérarchie de volumes englobants (BVH) dans XDXR. Il est chargé de gérer le parcours et les décisions de haut niveau, comme le choix des shaders à appeler (par exemple, closest-hit et any-hit). Il ne s’occupe pas des mécanismes réels d’appel du shader : cette responsabilité incombe au Scheduler. 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 d’un matériel personnalisé effectuant les tests d’intersection rayon/boîte englobante alignée sur les axes (AABB). Pour plus d’informations, consultez Conception matérielle du raytracing.Parcours
XDXR n’implémente actuellement aucune forme de réempaquetage, de tri ou de réorganisation des rayons. Dès qu’un shader de génération de rayons est invoqué, tout thread qui ne trace pas activement un rayon est une « voie inactive » dans la wave et gaspille des occasions d’effectuer un travail utile. Conceptuellement, un rayon est généré sur un thread donné. Toutes les invocations ultérieures de shaders ou de rayons récursifs résident sur ce même thread. Si un shader de génération de rayons génère deux rayons sur la voie 0 et aucun rayon sur toutes les autres voies d’une wave, 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, appelé parcours « Divergent », est 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 « Hybrid ». Cet algorithme effectue le parcours de la TLAS à l’aide de branchements scalaires, et ne diverge qu’à l’entrée dans une BLAS. Le parcours hybride peut offrir des performances nettement améliorées sur certains contenus et certaines charges de travail de raytracing.
Pour activer le parcours « Hybrid », 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.
