Petit moteur de ray‑tracing pédagogique en C++20 — rendu basique de sphères et plans avec ombres, normales, profondeur et éclairage ponctuel.
- Tracé de rayons primaire (depth map).
- Calcul des normales et colormap.
- Éclairage ponctuel (L_i = V(P,Lp) * L_emit / d^2 * Albedo * |N·L|).
- Shadow rays (visibilité) et atténuation physique.
- Export PPM pour visualiser le rendu.
RaytracingEngine/Math.cpp— vecteurs, rayons, caméra.RaytracingEngine/Shape.h— Sphere, Plane, HitInfo.RaytracingEngine/Light.h— définition des lights.RaytracingEngine/Scene.h— génération depth/normal/color/light maps, combine.RaytracingEngine/RaytracingEngine.cpp— point d'entrée, initialisation scène.RaytracingEngine/Image.h|cpp— écriture PPM.
- Visual Studio 2022 (ou tout compilateur supportant C++20)
- Aucun package externe requis.
- Ouvrir la solution dans Solution Explorer.
- Sélectionner la configuration (Release/Debug) et la plateforme.
- Pour lancer sans debugger : Ctrl+F5 ou menu Debug > Start Without Debugging.
- Le programme génère
output.ppmet tente d’ouvrir GIMP viasystem("start ...")— supprimer/adapter si non souhaité.
- Caméra : initialisée dans
RaytracingEngine.cpp(position, focale, resolution, near/far). - Lumière :
Light(position, color, intensity).intensityest un scalaire physique et peut être élevé. - Planes / Spheres : position, normale, couleur (albédo).
La formule implémentée est : L_o = L_e + V(P,L_p) * (L_emit / d^2) * Albedo * max(0, N·L)
V(P,L_p)est évalué par un shadow ray (origine décalée par unbias).L_emit=light.color * light.intensity.- L’atténuation physique utilisée :
1 / d^2.
- Normales mal orientées → surfaces éclairées à l’envers. Vérifier
Plane::normaletSphere::getNormalAt. - Self‑intersection / acne : ajuster
bias(ex. 1e‑3) et rester cohérent avecHitInfo::hasHitSomething()(seuil distance). - Si tout est trop lumineux ou sans contraste : diminuer
ambient, réduirelight->intensityou ajuster atténuation. - Si vous ne voyez pas d’ombres, tester temporairement
attenuation = 1.0etambient = 0.0pour isoler la visibilité. - Multiplications : utiliser
.dot()pour produit scalaire,*pour multiplication composante×scalaire ou composante×composante (couleurs). Le fichierMath.cppcontient les opérateurs critiques.
- Ajouter
Material.emissionet l’ajouter à L_o pour surfaces émissives. - Soft shadows : échantillonner une light area (multiple shadow rays).
- BRDFs plus réalistes (Cook‑Torrance), textures, réflexions/réfraction (recursion).
- Tone mapping / clamp avant conversion 0..255 dans
tonemap().
- Mettre
ambient = 0.0etattenuation = 1.0puis vérifier que les ombres nettes apparaissent. - Dessiner une petite grille ou positionner une sphère en haut à gauche pour valider orientation Y (la camera inverse Y écran → monde).
Projet personnel (répertoire cloné : https://github.com/Sorax5/RaytracingEngine). Pour questions ou patchs : ouvrir une issue / PR sur le dépôt GitHub.






