Auteur : Sagaert Auguste
Chapitre 4 TD 1 : Rendu d’une sphère par Raymarching
Mise en place du pipeline de rendu procédural
Pour ce premier TD, l’objectif était de contourner le pipeline de rendu classique d’Unity (basé sur des maillages de triangles) pour dessiner une sphère purement par les mathématiques via un Compute Shader.
Nous avons commencé par créer le shader RaymarchingSphere.compute et un script C# compagnon ComputeRaymarchingSphere héritant de URPComputeAsset. Ce script sert de pont entre le CPU et le GPU : il injecte les données nécessaires (matrices de caméra, couleurs, lumières) dans le shader via un CommandBuffer.
L’idée est de traiter chaque pixel de l’écran indépendamment grâce au parallélisme du GPU.
Modélisation mathématique (SDF) et Génération de Rayons
Contrairement à la modélisation 3D classique, ici la scène est définie par une fonction de distance signée (SDF). Pour une sphère, la formule est simple : c’est la distance entre le point testé et le centre de la sphère, moins son rayon.

Le défi principal a été de générer les rayons de vision. Comme un Compute Shader ne possède pas de coordonnées UV natives, nous avons dû :
- Convertir l’identifiant du thread (id.xy) en coordonnées UV normalisées [-1, 1]
- Transformer ces coordonnées de l’espace écran vers l’espace monde en utilisant les matrices inverses de la caméra
Cela nous donne pour chaque pixel une rayOrigin (position de la caméra) et une rayDirection (vecteur normalisé vers la scène).
L’algorithme de Raymarching
Une fois le rayon lancé, nous entrons dans le cœur du sujet : la boucle de Raymarching.
Contrairement au Raytracing classique qui cherche l’intersection exacte mathématique, le Raymarching avance pas à pas. À chaque étape, on demande à la SDF : “À quelle distance suis-je de l’objet le plus proche ?“. Cette distance devient la taille de notre prochain pas. On répète l’opération tant qu’on n’a pas touché l’objet (distance très petite, proche de 0) ou qu’on n’est pas allé trop loin.

Calcul de l’éclairage et des Normales
Afficher une sphère de couleur unie ne suffit pas pour percevoir son volume, nous avons donc ajouté un ombrage de type Lambert.
Le problème, c’est que sans maillage 3D, nous n’avons pas de “normales” (vecteurs perpendiculaires à la surface) pré-calculées. Nous avons dû les estimer dynamiquement en utilisant la technique du gradient : on échantillonne la SDF à trois points légèrement décalés autour de notre point d’impact et on calcule la différence.

Une fois la normale obtenue, le calcul d’éclairage est classique : on fait un produit scalaire (dot product) entre la normale et la direction inversée de la lumière. Cela crée naturellement des zones claires face à la lumière et des zones d’ombre ailleurs.
Conclusion
Ce TD a permis de comprendre que l’on peut générer des volumes 3D complexes et éclairés sans aucun polygone, juste avec des maths et une boucle de marche de rayons.
