Raymarching dans Unity



Bien que nous puissions avoir des rendus d’images photoréalistes, voir physicoréalistes à partir de scènes 3D très détaillées, les calculs sont fait hors ligne. C’est calculs s’appuient sur des méthodes de raytracing ou l’un de ses proches parents.

Les progrès rapides du matériel professionnel et grand public nous permet d’avoir accès à des rendus similaires en temps réel (ou presque) sur les ordinateurs de bureau.

Les mobiles n’ont pour l’heure pas encore cette puissance pour nous ofrrir ce genre de rendus.

Il est n’est en effet pas possible aujourd’hui de faire du raytracing sur des tablettes ou des smartphones. Cependant quelques astuces du domaine existent (notamment popularisées par la scène du demomaking), comme le raymarching par exemple.

Raymarching scene made by Iñigo Quilez (there's only functions in there, no geometry !)

Scène raymarchée, production d’Iñigo Quilez (uniquement des fonctions mathématiques ici, aucune géométrie !)

Quand on fait un calcul de scène 3D par raymarching, le rayon ne progresse pas en itérations fixes, mais par itérations variables, s’appuyant sur la distance à la surface la plus proche à chaque pas.

08_displacement_05

Tout est calculé dans le fragment shader, il n’y a aucune géométrie à l’exception des deux triangles nécessaires pour afficher le rendu sur la surface d’un quad.

Cette technique a été popularisée par Inigo Quilez dont une présentation est disponible ici : Rendering Worlds with Two Triangles

Dans cette video, on peut voir une scène « classique » d’Unity affichant l’atrium de Sponza. Cette scène comporte un simple quad affichant les différents shaders en raymarching. Il n’y a strictement aucune autre géométrie dans la partie raymarching de la scène !

01

Puisque le quad est intégré à la scène 3D, il a sa propre profondeur au sein de cette scène. Il est possible de faire le rendu de cette scène selon différentes passes, mêlant rendu de contenu 3D avec shaders en raymarching. À ce stade, il s’agit bien d’un moteur de rendu 3D hybride.

Pour le moment, seuls des objets pouvant être définis par des fonctions mathématiques (signed distance fields) peuvent être représentés dans une scène en raymarching.

03

Dans la vidéo, tandis que le crâne de cristal est dans la scène de Sponza, l’environnement est échantillonné puis utilisé pour avoir les bonnes réflexions et réfractions au sein de la passe de raymarching.

Quelques pixels noirs sont perceptibles dans cette passe (quand le verre tourne par exemple) : cela signifie qu’il n’y a pas encore assez de pas durant la passe de raymarching pour donner au pixel la bonne couleur. Ceci implique que les shaders soient convenablement paramétrés pour s’accorder aux caractéristiques propres à l’objet rendu.

04

Quand cette scène est affichée sur un iPad Air de première génération, le framerate ne va pas en-dessous de 15FPS et se trouve au-dessus de 25FPS la majorité du temps (en fait le framerate chute quand le zoom sur les objets en raymarching est trop fort)

La plupart de ces shaders ont été adaptés à partir de ceux disponibles sur http://www.shadertoy.com, les auteurs conservent leurs droits sur leur travaux, il ne s’agit ici que d’une démo interne.

Lien vers la vidéo : https://vimeo.com/131112582