← Projets

miniRT

septembre 2024

CTexturesRaytracingBump maping42
github

Probablement mon projet préféré du tronc commun de 42, celui où j’ai vraiment découvert la programmation graphique. Je travaille actuellement sur le projet suivant, RT, à venir bientôt !

Aperçu

Un moteur de ray tracing construit de zéro en utilisant uniquement MiniLibX (la bibliothèque graphique pédagogique de 42). le moteur de rendu gère les primitives géométriques standards — sphères, plans, cylindres, cônes, disques — avec l’éclairage selon le modèle de Phong, la projection d’ombres et les réflexions. Une interface interactive en temps réel permet de sélectionner et de modifier n’importe quel object de la scène au clavier, avec un tableau de bord affichant l’état courant.

Le code est organisé autour de trois systèmes de dispatch — intersection, calcul de normale, mapping UV — chacun implémenté comme un maillon d’une liste chaînée de handlers typés. Cette architecture a émergé progressivement au fil du projet, à mesure que les types de primitives se multipliaient: plutôt que de faire grossir une chaîne de conditions, chaque type d’objet enregistre son propre handler à l’initialisation.

Mes contributions ont porté sur l’architecture globale du projet et sur l’ensemble du pipeline des textures. L’ajout des textures a nécessité d’implémenter un dépliage UV propre à chaque primitive — coordonnées sphériques pour les sphères, projection cylindrique pour les cylindres et les cônes, projection planaire pous les plans et les disques, chacune avec ses propres cas particuliers. Le bump mapping ajoute une couche supplémentaire: les normales de surface sont perturbées dans l’espace tangent à partir de dérivées de hauteur échantillonnées sur une heightmap, ce qui a demandé de se documenter à la fois sur les mathématiques (construction du repère tangent/bitangent, perturbation de normale) et sur la bonne méthode d’échantillonnage pour chaque primitive.

Les réflexions sont implémentées via un ray tracing récursif limité à un profondeur de 2 — une fonctionnalité bonus, volontairement gardée simple.