L’accès aux fonctionnalités de lancer de rayons du TD est très similaire à la manière dont l’échantillonnage et le filtrage des textures sont effectués aujourd’hui.
Deux nouvelles instructions ont été ajoutées au jeu d’instructions du GPU.
- image_bvh_intersect_ray
- image_bvh64_intersect_ray
Descripteur de BVH
Le descripteur de texture du BVH fait 128 bits et est organisé comme indiqué dans le tableau suivant. | Champ | Bits | Taille | Données | |---|---| | Adresse de base du BVH | 39:0 | 40 | Adresse de base du BVH, alignée sur 256 octets. Par exemple, 0 = 0x0, 1 = 0x100 et 2 = 0x200. | | Inutilisé | 54:40 | 15 | Doit être égal à zéro. | | Valeur d’agrandissement des boîtes | 62:55 | 8 | Nombre d’ULP à ajouter lors d’un test rayon-boîte, encodé sous forme d’entier non signé. | | Tri des boîtes activé | 63 | 1 | Indique si les résultats des tests rayon/AABB doivent être triés. | | Taille | 105:64 | 42 | Nombre de nœuds du BVH moins 1. Applique une vérification des limites lors des accès. | | Inutilisé | 119:106 | 17 | Doit être égal à zéro. | | Mode de retour des triangles | 120 | 1 | 0 : Mode de retour des triangles 0. 1 : Mode de retour des triangles 1. Plus d’informations dans une section ultérieure. | | Inutilisé | 122:121 | 2 | Doit être égal à zéro. | | Grandes pages | 123 | 1 | Indique que toutes les pages mémoire utilisées sont inférieures ou égales à 64 Ko. Étant donné que le pilote XBOX ne prend pas en charge les tailles de page inférieures à 64 Ko pour l’accès GPU, cette valeur doit toujours être 1. | | Type | 127:124 | 4 | Doit être défini sur 0x8. |Types de nœuds de BVH
L’instruction d’intersection de rayon décrite précédemment ne prend pas la géométrie (AABB ou triangles) en entrée via des VGPR. Au lieu de cela, une adresse de 32 bits (« node_pointer ») spécifie le nœud du BVH sur lequel effectuer le test d’intersection. L’avantage de cette approche est que l’opération mémoire et le test d’intersection peuvent être fusionnés en une seule opération par le TD. Le plus grand nœud faisant 128 octets, l’approche alternative aurait consisté à charger, stocker et transmettre l’équivalent de 32 VGPR de charge utile « géométrique » supplémentaire, en plus des 11 VGPR déjà utilisés pour les données du rayon. L’occupation aurait été gravement affectée par la nécessité de fournir jusqu’à 43 VGPR en entrée d’une instruction image_bvh_intersect_ray. Par conséquent, le matériel comprend nativement trois formats prescrits de nœuds de BVH.- Nœud AABB FP16 (stockant 4 AABB) : 64 octets
- Nœud AABB FP32 (stockant 4 AABB) : 128 octets
- Nœud de triangles (stockant jusqu’à 4 triangles) : 64 octets
Format de nœud de triangles (types de nœud 0, 1, 2 et 3)
La section suivante reflète fidèlement la prise en charge matérielle ; toutefois, il a été décidé dans XDXR de n’utiliser que deux triangles par nœud feuille et de stocker des métadonnées dans les entrées restantes._
- Triangle 0 :
- Triangle 1 :
- Triangle 2 :
- Triangle 3 :

Le TD effectue un test d’intersection rayon/triangle sur un seul des quatre triangles stockés dans le nœud, ce qui diffère du comportement du test rayon/AABB, où les quatre AABB sont testées. Le triangle à tester parmi les quatre est spécifié par les 3 bits de poids faible de « node_pointer » lors de l’appel à image_bvh_intersect_ray. Ces valeurs sont présentées dans le tableau suivant.
Données renvoyées par l’intersection
Lorsque le « Mode de retour des triangles » du descripteur de BVH est défini sur 0, les quatre VGPR renvoyés contiennent les données présentées dans le tableau suivant.
Lorsque le « Mode de retour des triangles » du descripteur de BVH est défini sur 1, les quatre VGPR renvoyés contiennent les données présentées dans le tableau suivant.
L’état d’impact peut être déduit en calculant si (t_num/t_denom) est inférieur à ray_extent.
En mode de retour des triangles 1, le champ « triangle_id » du nœud de BVH sert à remapper l’ordre des sommets tels qu’ils ont été stockés dans le nœud de triangles par rapport à l’ordre dans lequel ils ont été fournis au générateur de BVH. Par exemple, avec le tampon d’index suivant, cette séquence de quatre triangles/cinq sommets peut être stockée dans un seul nœud de triangles (où 0 = V0, 1 = V1, 2 = V2, 3 = V3 et 4 = V4).
, , , ,
Cependant, les deuxième et troisième triangles sont des rotations de l’ordre implicite défini par le matériel. Le sommet commun (V2) est le 3e sommet du triangle 1 tel que défini par le matériel (V1,V3,V2), mais il est spécifié en deuxième position dans le tampon d’index d’entrée. Par conséquent, les coordonnées barycentriques « I » et « J » doivent être relatives à l’entrée du tampon d’index , et non à l’ordre implicite du triangle 1 dans le matériel .
Pour atténuer ce problème, les octets 63:60 du nœud de triangles définissent plutôt 4 ensembles de bits de « remappage » qui indiquent au matériel par rapport auquel des 3 sommets du triangle les coordonnées barycentriques I et J doivent être exprimées. L’interprétation des octets 63:60 à cette fin est présentée dans le tableau suivant.
| Champ | Bits | Taille | Données | |---|---| | Triangle 0, sommet source de « I » | 1:0 | 2 | 0 : « I » est le poids barycentrique de V0. 1 : « I » est le poids barycentrique de V1. 2 : « I » est le poids barycentrique de V2. 3 : inutilisé. | | Triangle 0, sommet source de « J » | 3:2 | 2 | 0 : « J » est le poids barycentrique de V0. 1 : « J » est le poids barycentrique de V1. 2 : « J » est le poids barycentrique de V2. 3 : inutilisé. | | Inutilisé | 7:4 | 4 | 4 bits d’espace libre. Utilisables à n’importe quelle fin ; aucune valeur particulière n’est requise. | | Triangle 1, sommet source de « I » | 9:8 | 2 | 0 : « I » est le poids barycentrique de V1. 1 : « I » est le poids barycentrique de V3. 2 : « I » est le poids barycentrique de V2. 3 : inutilisé. | | Triangle 1, sommet source de « J » | 11:10 | 2 | 0 : « J » est le poids barycentrique de V1. 1 : « J » est le poids barycentrique de V3. 2 : « J » est le poids barycentrique de V2. 3 : inutilisé. | | Inutilisé | 15:12 | 4 | 4 bits d’espace libre. Utilisables à n’importe quelle fin ; aucune valeur particulière n’est requise. | | Triangle 2, sommet source de « I » | 17:16 | 2 | 0 : « I » est le poids barycentrique de V2. 1 : « I » est le poids barycentrique de V3. 2 : « I » est le poids barycentrique de V4. 3 : inutilisé. | | Triangle 2, sommet source de « J » | 19:18 | 2 | 0 : « J » est le poids barycentrique de V2. 1 : « J » est le poids barycentrique de V3. 2 : « J » est le poids barycentrique de V4. 3 : inutilisé. | | Inutilisé | 23:20 | 4 | 4 bits d’espace libre. Utilisables à n’importe quelle fin ; aucune valeur particulière n’est requise. | | Triangle 3, sommet source de « I » | 25:24 | 2 | 0 : « I » est le poids barycentrique de V2. 1 : « I » est le poids barycentrique de V4. 2 : « I » est le poids barycentrique de V0. 3 : inutilisé. | | Triangle 3, sommet source de « J » | 27:26 | 2 | 0 : « J » est le poids barycentrique de V2. 1 : « J » est le poids barycentrique de V4. 2 : « J » est le poids barycentrique de V0. 3 : inutilisé. | | Inutilisé | 31:28 | 4 | 4 bits d’espace libre. Utilisables à n’importe quelle fin ; aucune valeur particulière n’est requise. |
Les bits de triangle_id étant utilisés pour remapper les coordonnées barycentriques vers les sommets requis, ils ne peuvent plus servir à stocker un ID de triangle de base. Comme disposer d’un ID de triangle est souvent nécessaire pour les calculs d’ombrage ultérieurs (par exemple, pour lire des données de sommet/primitive telles que les coordonnées de texture (UV) et les normales), ces données devront être stockées dans une structure distincte et lues manuellement.
Format de nœud AABB FP16 (type de nœud 4)
Format de nœud AABB FP32 (type de nœud 5)
Données renvoyées par l’intersection d’AABB FP16 et FP32
Si l’option « Tri des boîtes activé » du descripteur de BVH est définie sur 0, le tableau suivant décrit les 4 VGPR renvoyés et leur rôle.
Si l’option « Tri des boîtes activé » du descripteur de BVH est définie sur 1, le tableau suivant décrit les 4 VGPR renvoyés et leur rôle.
Informations supplémentaires
- Il n’est pas nécessaire que tous les threads actifs d’une wave demandent la même adresse de nœud ou le même type de nœud pour l’intersection. Certains threads peuvent demander un test d’intersection rayon/triangle, tandis que d’autres effectuent un test d’intersection d’AABB FP16 ou FP32 dans la même instruction.
- Toutes les opérations effectuées au sein du TD utilisent la virgule flottante simple précision.
- Tous les tests d’intersection rayon/AABB et rayon/triangle sont étanches (watertight).
- Les voies inactives peuvent être considérées comme largement « gratuites » et ne consomment pas de cycles au sein du TD. Une voie peut être rendue inactive de l’une des manières suivantes :
- En utilisant le masque d’exécution (c’est-à-dire le contrôle de flux)
- En définissant sur NaN une composante quelconque des éléments suivants : direction du rayon, direction inverse du rayon, origine du rayon et étendue du rayon
- En définissant sur Inf une composante quelconque de l’élément suivant : origine du rayon
