RayQuery décrit dans DXR 1.1. Cependant, nous fournissons une implémentation de parcours dans un seul en-tête (avec plusieurs variantes) qui partage la majeure partie de notre logique de parcours DXR 1.0 et l’encapsule dans une API largement équivalente à l’API de l’objet RayQuery. Cet en-tête peut être utilisé dans n’importe quelle étape de nuanceur qui permet l’allocation de LDS par l’utilisateur, y compris les nuanceurs de calcul et de pixels.
Ce système devrait permettre une conversion simple (presque 1:1) du code de rendu PC reposant sur le RayQuery de DXR 1.1. De plus, dans les situations comportant un petit nombre de nuanceurs de lancer de rayons (AnyHit/ClosestHit/etc.), ce système est souvent nettement plus rapide que le lancer de rayons de style DXR 1.0 sur XBOX, en raison d’une surcharge moindre. Il est fortement recommandé d’utiliser ce système d’en-tête en ligne pour les fonctionnalités de rendu comme les ombres ou l’occlusion ambiante.
Notez que XDXR n’effectue actuellement pas l’intégration en ligne des petites tables de liaison de nuanceurs pour DXR 1.0. Certains IHV PC peuvent avoir des recommandations différentes pour cette raison. Nous recommandons de profiler les compromis du lancer de rayons XBOX indépendamment des pilotes PC.
Utilisation
En-têtes
À la place de l’objetRayQuery de DXR 1.1, nous fournissons plusieurs versions d’un fichier d’en-tête XDXRStandaloneTraverse***.hlsli dans le répertoire d’installation du GDK : GDK_Install_Path\GDK_Version\GXDK\gameKit\Include\Scarlett.
Ces en-têtes sont fournis sous forme de code source; toutefois, il incombe au développeur de s’assurer que la version de son fichier d’en-tête est compatible avec le GDK avec lequel ses BVH sont construits. Les versions antérieures de l’en-tête ne seront pas prises en charge sur les GDK plus récents, et les modifications de l’en-tête doivent être fusionnées avec toute modification provenant d’un GDK plus récent.
Actuellement, ces versions sont les suivantes :
- XDXRStandaloneTraverseShortStack.hlsli
- Cette version du parcours reflète l’algorithme de parcours par défaut actuellement utilisé pour la prise en charge de DXR 1.0 dans XDXR. Recommandée pour tout lancer de rayons susceptible d’être divergent, comme l’AO ou les réflexions brillantes.
- XDXRStandaloneTraverseHT.hlsli
- Cette version du parcours implémente un algorithme de parcours « cohérent » qui peut être plus rapide que les autres algorithmes pour du contenu très cohérent comme les rayons d’ombre ou les réflexions miroir. Cela équivaut à spécifier
XBOX_RAY_FLAG_COHERENT_RAYS_HINTdans les indicateurs de rayon de votreTraceRay()DXR 1.0.
- Cette version du parcours implémente un algorithme de parcours « cohérent » qui peut être plus rapide que les autres algorithmes pour du contenu très cohérent comme les rayons d’ombre ou les réflexions miroir. Cela équivaut à spécifier
- XDXRStandaloneTraverseShortStackNoMultibox.hlsli
- Cette version du parcours ne prend pas en charge les BVH construits hors ligne, mais peut être légèrement plus rapide si seules des constructions de BVH à l’exécution sont effectuées.
- XDXRStandaloneTraverseLongStack.hlsli
- Cette version du parcours a une taille de pile maximale de 32 nœuds; elle peut être plus rapide sur certains contenus, mais peut entraîner des impacts de rayons manqués.
Intégration
Les en-têtes XDXRStandaloneTraverse fournissent un objetXboxRayQuery qui reflète l’objet RayQuery de DXR 1.1. Mis à part le nommage, l’API devrait être identique à celle de DXR 1.1, avec les différences suivantes :
- Les indicateurs de modèle comme
XboxRayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES>sont pris en charge uniquement lors de la compilation avec HLSL 2021, dans le GDK de mars 2024 ou ultérieur. - Avant HLSL 2021 et le GDK de mars 2024, à la place de
RayQuery<RAY_FLAG_XXX | RAY_FLAG_YYY>, les utilisateurs doivent effectuer l’une des opérations suivantes :- Placer tous les indicateurs dans le paramètre rayFlags de TraceRayInline(). Privilégiez les littéraux de compilation pour les indicateurs plutôt que des valeurs de mémoire tampon constante afin de permettre une meilleure génération de code. Envisagez de créer des branches autour de différents appels à TraceRayInline() si vous souhaitez basculer des indicateurs.
- À la place de
RayQuery<RAY_FLAG_FORCE_OPAQUE>, utilisezXboxRayQuery.TraceRayInlineNoAHS(); de même, utilisezXboxRayQuery.TraceRayInlineNoIS()ouXboxRayQuery.TraceRayInlineNoAHSNoIS()pour désactiver la gestion des nuanceurs d’intersection.- De façon équivalente, l’objet
XboxRayQuerycomporte les membres booléensdisableAHSetdisableIS, qui peuvent être définis sur des littéraux après l’appel àTraceRayInline, mais avant le premier appel àProceed().
- De façon équivalente, l’objet
XboxRayQuerymaintient un état global; toute utilisation d’un objetXboxRayQuerydoit être terminée avant la création ou l’utilisation d’un deuxième objet. Cela inclut l’interrogation de l’état ou des renseignements d’impact final.- XDXR (et
XboxRayQuery) ne prennent actuellement pas en chargeRAY_FLAG_SKIP_TRIANGLESniRAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES. Si une séparation est nécessaire, envisagez de construire plusieurs TLAS en parallèle avec l’API de générateur par lots.- Une exception est que
XboxRayQuery<RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES>est pris en charge dans HLSL2021 et équivaut àXboxRayQuery.TraceRayInlineNoIS(). Cet indicateur est pris en charge uniquement en tant que paramètre de modèle.
- Une exception est que
- En raison de la structure de l’algorithme cohérent,
XDXRStandaloneTraverseHT.hlsliexige que tout le code de gestion deProceed()vérifie qu’un impact valide a bien été signalé en ajoutant unif (query.CandidateType() == CANDIDATE_NON_OPAQUE_TRIANGLE || query.CandidateType() == CANDIDATE_PROCEDURAL_PRIMITIVE)avant la logique AnyHit ou de nuanceur d’intersection. Bien que cela soit permis dans DXR 1.1 normal, cette vérification est souvent omise s’il est connu que le BVH ne contient qu’un seul type de primitive. Cela entraînera des artefacts dans l’implémentationXDXRStandaloneTraverseHT.hlsli. - L’implémentation de parcours
XDXRStandaloneTraverseHT.hlsliexige que les indicateurs de rayon et le pointeur de TLAS soient uniformes. - Le parcours autonome XDXR comprend plusieurs extensions absentes de DXR 1.1, abordées dans la section suivante.
CurrentNumIterations() et SetMaxNumIterations()
Le parcours autonome XDXR ajoute deux extensions simples liées à l’interrogation et à la limitation du nombre d’itérations de parcours. Notez que chacune de ces extensions peut entraîner une pression VGPR ou une charge ALU supplémentaire. Les utilisateurs ne devraient pas utiliser ou activer ces fonctionnalités, sauf s’ils ont l’intention de définir une limite d’itérations suffisamment basse pour compenser le coût supplémentaire.XboxRayQuery.CurrentNumIterations()renvoie le nombre d’itérations de la logique de parcours effectuées jusqu’à présent. Cette fonction peut être appelée après le parcours, pour dessiner une carte thermique, ou dans la logique AHS ou similaire pour prendre des décisions. Toute référence à cette fonction dans votre nuanceur ajoute un léger coût au parcours, y compris lorsqu’elle est derrière un indicateur d’exécution. Il est recommandé de placer tout mode « carte thermique » derrière un indicateur#ifdefpour s’assurer que les modes de version finale ne sont pas affectés.XboxRayQuery.SetMaxNumIterations(uint maxNumIterations)permet de définir un nombre maximal d’itérations, après lequel le parcours se terminera prématurément, et les résultats incluront l’impact validé le plus récent (ou rien, si aucun n’a encore été trouvé).- Pour utiliser cette fonctionnalité,
#define XDXR_ENABLE_ITERATION_LIMIT 1doit être défini avant l’inclusion de l’en-tête de parcours. - Placez l’appel à
XboxRayQuery.SetMaxNumIterations(YOUR_ITERATION_LIMIT)après l’appel àXboxRayQuery.TraceRayInline()et avant l’appel àXboxRayQuery.Proceed(). - Pour vérifier si le parcours s’est terminé prématurément, vérifiez si
XboxRayQuery.CurrentNumIterations() >= YOUR_ITERATION_LIMIT. Notez que le nombre d’itérations peut être supérieur à la limite, en particulier dans le cas deXDXRStandaloneTraverseHT.hlsli, car certaines étapes du parcours ne peuvent pas être interrompues prématurément sans entraîner un coût important.
- Pour utiliser cette fonctionnalité,
InlineAHS et InlineIS
Le parcours autonome XDXR fournit deux extensions pour améliorer la vitesse de parcours lorsqu’une logique AnyHit ou de nuanceur d’intersection simple est requise. Par défaut, le parcours RayQuery de DXR 1.1 doit sortir de la boucle de parcours du BVH afin de donner le contrôle à l’utilisateur pour la gestion de la logique AnyHit ou de nuanceur d’intersection dans une bouclewhile(query.Proceed()). Cela peut entraîner un contrôle de flux complexe et des performances sous-optimales.
Le parcours autonome XDXR fournit les mécanismes InlineAHS et InlineIS pour améliorer les performances en permettant d’intégrer en ligne la logique AHS ou IS dans la boucle de parcours.
À partir du GDK de mars 2024, les définitions XDXR_USE_INLINE_AHS_FUNCTION et XDXR_USE_INLINE_IS_FUNCTION sont dépréciées. Les fonctionnalités InlineAHS et InlineIS sont maintenant offertes au moyen d’une API basée sur les modèles HLSL 2021, qui présente plusieurs avantages. Les instructions pour la version HLSL 2021 suivent, avec une section sur la version antérieure ci-dessous.
InlineAHS et InlineIS en HLSL 2021
- Créez une structure HLSL qui étend
InlineAHSBaseLambda,InlineISBaseLambdaouInlineAHSAndISBaseLambda, selon que vous avez besoin d’une logique AnyHit (AHS), d’une logique d’intersection procédurale (IS) ou des deux. - Créez une fonction avec la signature et le nom
void InlineAHS(inout XboxRayQueryProxy rqp)et/ouvoid InlineIS(inout XboxRayQueryProxy rqp)dans votre structure. - Coupez/collez toute la logique AHS et IS de votre boucle
while(query.Proceed()) {ISLogic(); AHSLogic()}dans les fonctionsInlineAHSouInlineIS. - L’objet
XboxRayQueryProxyprend en charge toutes les mêmes fonctionnalités que l’objetXboxRayQuerynormal, à l’exception de l’accesseurXboxRayQuery.CandidateType(). Gérez la logiqueCANDIDATE_NON_OPAQUE_TRIANGLEdansInlineAHS()et la logiqueCANDIDATE_PROCEDURAL_PRIMITIVE, y compris le test alpha, dansInlineIS(). - L’objet
XboxRayQueryProxypeut servir à interroger les renseignements de parcours exactement de la même façon qu’un objetRayQuerynormal, et à gérer les impacts au moyen des fonctionsrayQueryProxy.CommitNonOpaqueTriangleHit()ourayQueryProxy.Abort().rayQueryProxy.CandidateProceduralPrimitiveNonOpaque()peut être interrogé dansInlineIS()pour déterminer si la logique AHS doit être effectuée pour la primitive procédurale. C’est la même chose que le lancer de rayons en ligne standard de DXR 1.1.
- Lorsque
InlineAHSouInlineIS(ou les deux) sont utilisés, il n’est pas nécessaire de placer l’appel àrayQuery.Proceed()dans une boucle while, car le contrôle ne reviendra pas à l’utilisateur avant la fin du parcours. Toute la logique AHS ou IS sera intégrée en ligne au moyen des fonctions fournies.
InlineAHS et InlineIS en HLSL 2018 (déprécié)
- Spécifiez
#define XDXR_USE_INLINE_AHS_FUNCTION 1et/ou#define XDXR_USE_INLINE_IS_FUNCTION 1avant#include "XDXRStandaloneTraverse****.hlsli". Notez que si la logique AHS et la logique IS sont toutes deux présentes, elles doivent toutes deux utiliser le système Inline et ne peuvent pas être combinées avec les gestionnaires DXR 1.1 normaux. - Créez une fonction globale avec la signature et le nom
void InlineAHS(inout XboxRayQueryProxy rqp)et/ouvoid InlineIS(inout XboxRayQueryProxy rqp) - Suivez les instructions de la version HLSL 2021 ci-dessus, en remplaçant les fonctions membres InlineAHS et InlineIS de la structure par les fonctions InlineAHS et InlineIS définies globalement.
Mémoire
Le pilote XDXR alloue de la mémoire de stockage pour le parcours de styleTraceRay() de DXR 1.0. Si votre titre utilise uniquement le lancer de rayons en ligne, vous pourriez vouloir récupérer cette mémoire. En date de juin 2022, il s’agit de 12 Mo sur XBOX Series S et de 32 Mo sur XBOX Series X. Pour désactiver cette mémoire, un titre doit spécifier D3D12_GPU_VIRTUAL_ADDRESS_UNKNOWN pour pDXRStackBuffer et spécifier une taille de 0 pour DXRStackBufferOverrideSizeBytes dans D3D12XBOX_CREATE_DEVICE_PARAMETERS.
