Auteur : Sagaert Auguste
Chapitre 4 TD 2 : Gestion multi-formes et évolution du moteur procédural
Évolution de l’architecture du shader
Dans ce second travail pratique, l’objectif était de transformer notre prototype de rendu d’une sphère unique en un véritable moteur capable d’afficher une scène complexe composée de multiples primitives géométriques (cubes, tores, prismes).
La limitation principale du TD précédent résidait dans le codage “en dur” de la forme dans le shader. Pour surmonter cela, nous avons dû structurer les données. Nous avons défini une structure Shape commune au script C# et au code HLSL, contenant :
- Le type de forme (identifié par un entier)
- Sa position
- Sa couleur
- Sa taille
Cela nous permet de traiter toutes les formes de manière générique, qu’il s’agisse d’un cube ou d’un tore.
Implémentation des nouvelles Fonctions de Distance Signée (SDF)
La base mathématique a dû être élargie. Nous avons intégré les formules de distances signées pour les nouvelles formes, en nous basant sur les travaux de référence d’Inigo Quilez.
Par exemple, contrairement à la sphère qui est une simple distance euclidienne, le cube nécessite de calculer la distance par rapport aux bords d’une boîte alignée sur les axes, en utilisant des fonctions max et abs pour gérer les coins et les faces.
Pour centraliser la logique, j’ai implémenté une fonction d’aiguillage sdfShape. Cette fonction agit comme un “switch case” : elle reçoit une structure Shape et un point p, vérifie le champ shapeType, et redirige le calcul vers la fonction mathématique appropriée (sdfCube, sdfTorus, etc.).
Gestion des données via Compute Buffers
Le défi technique majeur a été la communication entre le CPU (C#) et le GPU. Pour envoyer une liste dynamique d’objets, nous avons mis en place un StructuredBuffer<Shape>.
Côté C# : nous créons une liste d’objets, calculons la taille exacte en octets de notre structure (stride), et remplissons le buffer.
Côté Shader : nous récupérons ce tableau et itérons dessus.
La logique de composition de la scène dans la fonction mapSceneSdf a été totalement revue. Au lieu de tester un seul objet, nous bouclons sur l’ensemble du buffer Shapes. L’astuce pour gérer la profondeur et l’occlusion (savoir quel objet est devant l’autre) repose sur l’opération d’Union basique des SDF : le min().

Cette approche nous permet désormais de générer des scènes aléatoires complexes simplement en changeant la liste envoyée par le C#, sans jamais recompiler le shader.

Réponses aux Questions
1. Principes de la Marche des Rayons (Raymarching)
Théorique :
Le Raymarching se distingue du Raytracing classique par sa méthode d’intersection. Le Raytracing résout analytiquement l’équation géométrique pour trouver l’intersection exacte rayon-triangle. Le Raymarching, lui, avance pas à pas le long du rayon. C’est ce qu’on appelle le Sphere Tracing.
L’avantage immense est qu’il permet de rendre des formes qui n’ont pas de définition polygonale claire, comme des fractales, des liquides, ou des nuages volumétriques.

2. Génération de Scènes Procédurales
Théorique :
La marche des rayons excelle dans la génération procédurale car elle manipule l’espace mathématique directement. On peut utiliser l’opérateur modulo (p.xyz % c) pour répéter un objet à l’infini dans l’espace sans coût mémoire supplémentaire (domain repetition).
3. Impact du Ray Marching sur la Génération
Théorique :
L’impact est double :
- Efficacité mémoire : une ville entière peut être décrite par une formule mathématique pesant quelques kilo-octets
- Coût calcul GPU : la complexité du rendu dépend du nombre de pixels à l’écran et de la complexité de la SDF, pas du nombre de polygones
4. Techniques Artistiques
Théorique :
Les artistes peuvent utiliser la “Géométrie de Construction de Solides” pour créer des formes impossibles. La technique la plus prisée est le Smooth Blending. Au lieu d’une union brutale entre deux objets, on utilise une fonction polynomiale qui crée un “col” liquide entre eux.
5. Avancées et Défis Techniques
Les moteurs comme Unreal Engine 5 utilisent des champs de distance signés pour l’éclairage global (Lumen) et les ombres douces, même si le rendu principal reste polygonal.
Le défi majeur reste l’antialiasing (les bords des objets SDF scintillent souvent) et l’animation de formes déformées qui rend le calcul des normales et des collisions physiques très complexe.