Quel est l'algorithme de pointe actuel pour les champs de hauteur de lancer de rayons?

16

Au fil des ans, il y a eu beaucoup d'articles sur différentes techniques pour dessiner un terrain à hauteur de champ dans un traceur de rayons. Certains algorithmes ray-mars la grille directement (ou via un quadtree); d'autres transforment le terrain en maillage polygonal et utilisent un test d'intersection rayon-triangle standard. La recherche semble avoir évolué au cours des dernières années, et il est difficile de trouver des articles écrits au cours de la dernière décennie, mais l'équilibre entre la mémoire et le calcul (CPU et GPU) est toujours en train de changer.

Quel type d'algorithme donne les meilleures performances sur les ordinateurs de bureau haut de gamme de nos jours? Ou s'il n'y a pas de réponse unique, en quoi les caractéristiques de performance des meilleurs algorithmes actuels diffèrent-elles?

Dan Hulme
la source
Réflexions de l'espace d'écran: créez un champ de hauteur à l'aide du tampon de profondeur et de trame, tracez-le pour obtenir des réflexions brutes. Je ne connais pas les détails, mais j'imagine que Crysis, Killzone, dernièrement Frostbite etc. auront utilisé une technique sophistiquée pour l'obtenir rapidement. Avez-vous examiné cela?
David Kuri
1
@DavidKuri Merci, c'est un bon pointeur pour savoir comment accélérer le défilement des rayons. Il devrait y avoir beaucoup d'optimisations possibles pour un champ de hauteur plus statique qui ne fonctionne pas si bien sur le traçage de l'espace d'écran, comme les mipmaps de pré-calcul ou un quadtree min-max, donc j'espère toujours une réponse qui couvre cela.
Dan Hulme
Hé Dan BTW vous cherchez des solutions CPU ou GPU? Et le rendu en temps réel ou non en temps réel?
Alan Wolfe
@AlanWolfe Mon utilisation est le GPU et non en temps réel (c'est-à-dire le débit maximum plutôt que la meilleure qualité d'image que vous pouvez gérer en 16 ms), mais je vais quand même voter pour des réponses intéressantes qui sont rapides sur le processeur ou principalement pour les moteurs de rendu interactifs.
Dan Hulme
Vous pouvez essayer de créer un champ de distance signé à partir de la carte de hauteur. C'est fondamentalement une texture 3D qui stocke la distance à la surface suivante. Cela permet de "parcourir le rayon plus rapidement". Unreal Engine 4 l'utilise pour l'occlusion ambiante de milieu de gamme, les ombres douces et les ombres de terrain en général
user1888

Réponses:

12

Pour l'état de l'art actuel, recherchez ce document: "Mipmaps maximales pour un rendu de champ dynamique en hauteur rapide, précis et évolutif", Tevs et al. 2008

L'idée de base est de sauter beaucoup d'espace en ayant connaissance de la valeur maximale sur de grandes surfaces de terrain. Si le rayon reste au-dessus, passez à la grande zone suivante.

Si vous regardez la figure 8, vous verrez une comparaison entre le pas linéaire de base et les mipmaps maximaux. La progression linéaire se traduit par 200 étapes, ce qui peut être fait en temps réel sur les gpus modernes mais est toujours lent. Les mipmaps maximales font de même en environ 10 étapes, le tout dans le shader.

Rama
la source
J'accepte cette réponse car le document lui-même est bon et sa section "Travaux connexes" semble assez complète. Même si je n'utilise pas exactement cette technique, je suis sûr que je pourrai adapter quelque chose pour mon cas d'utilisation à partir de cela et de ses références.
Dan Hulme
Avez-vous trouvé des démos avec Maximum mipmaps? Merci.
raRaRa
Je n'ai pas lu le papier, mais ce "mipmaps maximum" sonne très similaire à la technique utilisée pour le Cone Step Mapping (qui améliore la cartographie d'occlusion de parallaxe en sautant de grandes zones grâce aux cônes).
Julien Guertault
@JulienGuertault Je dirais qu'il s'agit d'un simple traçage HiZ. c'est une méthode sûre pour être sûr de ce que vous frappez. Mais pas très rapide par rapport aux méthodes dangereuses comme la recherche binaire.
v.oddou
4

Le meilleur que j'ai personnellement vu est ce que fait Inigo Quillez, qui est utilisé dans les trucs de la demoscène. Ray March le terrain, en faisant de plus grands pas plus vous vous éloignez de la caméra car (généralement) les détails importent moins à distance (exception = parois minces!). Il utilise des informations de pénétration et d'autres mesures faciles à obtenir pour simuler l'occlusion ambiante et d'autres techniques d'éclairage sophistiquées.

Voici une démonstration des éléments en action: https://www.youtube.com/watch?v=_YWMGuh15nE

Et voici la page d'IQ sur le raymarching terrain qui est une lecture assez intéressante: http://www.iquilezles.org/www/articles/terrainmarching/terrainmarching.htm

BTW, dans les jeux modernes, la technique de "réflexion de l'espace d'écran" n'est souvent qu'une marche de rayon contre le tampon Z de la scène rendue. Le tampon Z n'est vraiment qu'un champ de hauteur.

J'ai vu quelques discussions à ce sujet au siggraph 2014, et alors que certaines personnes utilisaient des techniques similaires à celles du QI, quelques-unes faisaient même moins bien que le QI, ce qui était intéressant à voir: P

Alan Wolfe
la source
1
L'algorithme de votre lien est très simple. Il a l'air moins sophistiqué que certains des papiers que j'ai trouvés dans les années 90. Cela semble être un bon point de départ, mais j'espère la solution la plus performante pour un système de production, pas seulement un "mon premier raytracer".
Dan Hulme
Ce truc est utilisé dans le code de la demoscène et les réflexions d'espace d'écran dans les jeux modernes les plus avancés. Le code le plus rapide est parfois le plus simple. Je ne le rejetterais pas en raison de sa simplicité. Il sera intéressant de voir si vous obtenez d'autres réponses.
Alan Wolfe
2
Ce qui manque dans votre réponse, c'est qu'IQ utilise un maillage de champ de hauteur standard comme estimation initiale pour lancer le raymarking du terrain réel. Il rend d'abord une version low-poly du terrain en utilisant la pixellisation standard, puis exécute un pixel shader sur l'image qui commence le raymarking à la profondeur pixellisée moins un certain seuil conservateur. C'est le seul moyen de faire cela en temps réel.
Benedikt Bitterli
Je crois que seule une partie de ce que vous dites est vraie. il utilise des heuristiques basées sur la hauteur du terrain (ainsi que la distance par rapport à la caméra) pour déterminer jusqu'où le rayon peut marcher, mais pour autant que j'aie entendu, il n'utilise pas la pixellisation. Voici un exemple de son travail, qui n'utilise pas la rastérisation, mais cela ne veut pas dire qu'il n'y a pas d'implémentations qui utilisent la rastérisation: shadertoy.com/view/MdX3Rr
Alan Wolfe
Je suis un peu confus que la question concerne le lancer de rayons, et cette réponse concerne la marche des rayons. Il y a une différence fondamentale entre les deux et ce qu'ils peuvent réaliser.
Julien Guertault