Traversal Shaders, que sont-ils et quelles applications a-t-il sur GPU

Ombrages de traversée

Depuis l'apparition de DirectX 8, le nombre de nouveaux types de shader a augmenté au fil du temps, les prochains à inclure dans la liste sont appelés Traversal Shaders, qui ont à voir avec les avancées vers l'adoption avec pause, mais sans frein de lancer de rayons dans Jeux. Voyons en quoi il consiste et quelles améliorations il apportera aux jeux en termes de performances.

Les Traversal Shaders sont l'une des deux philosophies afin de poser le problème du chemin de la structure de données spatiales dans le Ray Tracing, qui consiste à utiliser des programmes de shader pour parcourir la structure de données spatiales qui représente la scène au lieu d'utiliser des outils spécialisés ou dédiés. Matériel.

Tout d'abord, rappelons ce qu'est un Shader

Shader fonctionnel d'exemple

Dans le logiciel, nous connaissons familièrement sous le nom de shader un programme qui s'exécute sur les cœurs du GPU, qui portent des noms différents selon les fabricants. Donc AMD appelle ces pièces d'unités informatiques matérielles dans sa Radeon, NVIDIA les appelle Stream Multiprocessors ou SM dans sa GeForce et Intel leur donne dans ses noms ARC ces unités Xe Core.

Ainsi, le shader lui-même est le logiciel qui s'exécute sur l'une de ces unités, qui fonctionne très étroitement avec un Processeur, la différence est qu'un shader est un programme qui s'exécute sur une primitive graphique dans les différentes étapes du pipeline de rendu : sommets, primitives, triangles, fragments ou pixels. Bien que ces catégories ne soient rien de plus que des abstractions que nous réalisons, pour l'unité shader, tout est une donnée et cela signifie qu'elle peut exécuter toutes sortes de programmes.

Alors pourquoi ne pas utiliser un processeur ? Eh bien, en raison du fait qu'il existe des problèmes, les GPU, étant conçus pour fonctionner en parallèle, fonctionnent beaucoup mieux lors de la résolution de certains contextes que ce que fait un CPU, et de la même manière que cela se produit dans le cas des GPU.

Microsoft, DirectX Ray Tracing et ses shaders

Traçage de rayons Microsoft DirectX 12

Lorsque Redmond a parlé pour la première fois de la mise en œuvre du lancer de rayons lors de la Games Developer Conference en 2018, il restait quelques mois avant le lancement de la NVIDIA RTX 20 et à ce moment-là, il était complètement inconnu, du moins publiquement, des unités à accélérer. Ray Tracing tel que les cœurs RT de NVIDIA et les unités d'accélération des rayons d'AMD.

Ce qui était Microsoftla proposition d'étendre son API multimédia ? Eh bien, ajoutez une série d'étapes supplémentaires, qui sont définies dans le schéma suivant :

Étapas DXR

Comprendre le schéma est simple :

  • Les blocs en bleu sont des programmes de shader qui s'exécutent au niveau du GPU.
  • Les blocs en vert sont exécutés dans le CPU, pilote, en tandem avec le GPU.
  • Les diamants en gris sont des conditions qui peuvent se produire lorsque la foudre traverse la scène.

Or, dans ce schéma il y a un élément qui n'est pas inclus et c'est pour l'instant l'un des plus gros problèmes qui existent en ce qui concerne le Ray Tracing : le chemin de la structure d'accélération. Et qu'est ce que c'est que ça? Nous en avons parlé dans nos tutoriels de lancer de rayons, mais cela ne fait jamais de mal de s'en souvenir.

Structures de données pour accélérer le lancer de rayons

rbol BVH

Afin d'accélérer, et donc de faire tourner plus vite, les algorithmes de lancer de rayons, ce qui est fait est de cartographier la position des objets dans la scène dans une structure de données, qui a la forme d'un arbre binaire que le GPU. il faudrait y aller.

Pour que vous compreniez le processus de parcours de la structure de données, ce qui est fait est de commencer à partir de la racine qui représente l'ensemble de la scène et est spécifiée par niveaux jusqu'à atteindre le dernier niveau. Dans chaque niveau, ce qui est fait est de faire une demande au RT Core ou à l'unité équivalente pour calculer s'il y a une intersection, s'il y en a une alors ça descend au niveau suivant, s'il n'y en a pas alors ce chemin s'arrête complètement. Ceci est fait jusqu'à atteindre la fin de l'arbre, où l'intersection rayon-boîte n'est plus faite et l'intersection rayon-polygone est effectuée.

Si vous avez été perspicace, vous aurez vu que dans le schéma de la section précédente parmi les types de shaders nous avons ceux d'intersection, mais pas ceux chargés de parcourir l'arbre BVH, c'est-à-dire de les parcourir, bien que ce soit compris que cette tâche est effectuée par les shaders d'unités bien qu'il n'y ait pas de type spécifique de shader pour cela.

Les Traversal Shaders, que sont-ils et quelle est leur origine ?

Dans la documentation DirectX Ray Tracing, nous pouvons trouver parmi les futurs les soi-disant Traversal Shaders, qui seront ajoutés à l'avenir dans le pipeline pour le Ray Tracing dans une version ultérieure de l'API Microsoft, mais le mieux est de nous mettre dans la situation.

L'exercice de parcourir la structure de données jusqu'à présent malgré le fait qu'il s'agisse d'un programme de shader, celui-ci est générique et est contrôlé par le pilote graphique, donc les programmeurs n'ont rien à faire car il est bien entendu que le shader de traversée Cela donne le contrôle du code d'application pour parcourir le processus de traversée de la structure de données nœud par nœud.

Et quels avantages cela apporte-t-il à la performance ? Le principal est que l'on puisse définir des scénarios dans lesquels un ou plusieurs rayons sont écartés avant de faire l'intersection, ce qui n'est pas possible pour le moment. Un exemple très clair serait de faire face à des objets très éloignés de la caméra dans lesquels les détails de l'éclairage ne peuvent pas être aussi appréciés qu'à courte distance. Il faut tenir compte du fait que dans la version actuelle de l'API Redmond, nous pouvons définir en ce qui concerne l'éclairage indirect si un objet émet des rayons ou non via le Ray Generation Shader, mais nous ne pouvons pas créer de scénarios où nous pouvons exclure les rayons par vol. , surtout avec la distance.

Traversal Shaders pour construire la structure de données spatiales

Ombrages de traversée

La division R&D graphique d'Intel a présenté en 2020 un document intitulé Construction paresseuse de structures d'accélération avec des shaders de traversée et ceux d'entre vous qui maîtrisent un peu la langue shakespearienne en auront déduit qu'elle consiste en la construction des mêmes structures de données spatiales en utilisant des Traversal Shaders. Ceux-ci peuvent donc non seulement être utilisés pour contrôler le parcours, mais aussi pour le construire.

La première chose qui se démarque est Lazy Build, que nous pourrions traduire être éduqué comme une version avec peu d'effort. Et en quoi consiste-t-il ? Eh bien, ce que recherche cette technique, c'est que le temps de construction de la structure de données soit réduit. Pour cela, il se base sur des informations précédentes issues d'images précédentes ajoutées à un algorithme de visibilité et si cela vous semble confus, définissons ce que signifie visibilité lorsque l'on parle de rendu 3D.

Visibilité

Il faut partir du principe que lorsqu'un GPU fait un rendu ce qu'il fait c'est calculer la visibilité entre un point de l'espace et la première surface visible dans une direction donnée ou pour simplifier : la visibilité entre deux éléments. Avant de continuer, nous devons prendre en compte une chose. En lisant ceci, vous vous êtes sûrement imaginé en train de regarder deux objets. Eh bien, la chose n'est pas comme ça, nous parlons de la façon dont un objet en verrait un autre s'il pouvait voir, mais à partir de la définition la plus simple, cela fait référence à la caméra, qui est la vue à partir de laquelle nous rendons.

Dans le rendu hybride qui combine la rastérisation avec le lancer de rayons, qui est maintenant utilisé par tous les jeux, la visibilité de la caméra n'est pas calculée à partir dudit algorithme, mais plutôt avec l'algorithme de raster. L'idée à l'avenir est que la visibilité par rapport à la caméra soit réalisée à partir du Ray Tracing, de sorte qu'avec ces informations, le GPU finisse par construire une structure de données de l'ensemble de la scène à travers les Traversal Shaders.