École Centrale Lyon -- Cours de Rendu Réaliste [FR] (dernière année)
Notes de cours. Template de code. (2 fichiers stb_image en dépendance)
Ci-après une version accélérée du cours de raytracing, implémentation comprise. Les séances durent normalement 4h et laissent du temps pour implémenter. Ces vidéos ne se substituent pas aux cours ; elles ne font que le survoler. L'implémentation complète du pathtracer (jusqu'au cours 7 inclus) requiert environ 5h 15min -- au delà, il s'agit de temps passé à corriger vos bugs. Faites les choses bien du premier coup, cela vous fera gagner du temps! :) L'implémentation que je donne dans ces vidéos est à titre indicative, n'est pas codée proprement, et je ne veux pas voir mon code dans vos rendus de projet.
Cours 1 : introduction, calculs d'intersection rayon-sphère(s), modèle d'éclairage Lambertien.
Durée implementation : 45 min.
Cours 2 : Ombres portées, correction gamma, surfaces spéculaires et transparentes.
Durée implémentation : 25 min
Cours 3 : Équation du rendu, intégration de Monte-Carlo, éclairage indirect.
Durée implémentation : 15 min
Cours 4 : Anti-Aliasing, ombres douces, modèles de camera, depth-of-field.
Durée implémentation : 25 min
Voir errata plus bas.
Cours 5 (deux séances) : Intersection rayon-plan, rayon-triangle, rayon-boite englobante, gestion des maillages, bounding volume hierarchies, lissage de Phong.
Durée implémentation : 1 h 15 min
Cours 6 (additionnel) : Textures, roulette Russe, réflexion de Fresnel, modèles de BRDFs, motion blur.
Durée implémentation : 1 h 10 min
Errata du Cours 4 : Relation intensité lumière ponctuelle vs. sphérique, proba d'échantillonnage lumière sphérique, reflets lumière manquants sur surfaces spéculaires et transparentes. Petite optimisation intersection rayon-triangles.
Durée implémentation < 5 min
Cours 7 (additionnel) : Milieux participants + Errata Cours 5 (off-by-one dans construction BVH, et positivité du test rayon-boite).
Durée implémentation : 1 h
Errata Cours 4: l'implémentation proposée entre les cours 4 à 6 n'affiche pas la sphère lumineuse dans les reflets spéculaires purs ni derrière les objets transparents. J'avais séparé l'éclairage en une somme éclairage direct + indirect pour le cas des matériaux diffus, et n'avais donc pas inclu de contribution émissive dans l'éclairage indirect pour ne pas compter les sources de lumière 2 fois. Hors, un reflet spéculaire ou transparent peut être vu comme une contribution indirecte. Il manque donc les chemins qui relient les matériaux spéculaires à la source lumineuse (e.g., les caustiques). Deux autre bugs plus mineurs sur l'impact visuel sont aussi corrigés dans la vidéo Errata du Cours 4 (intensité de la lumière sphérique pour qu'elle matche la lumière ponctuelle, et erreurs dans la probabilité d'échantillonner la sphère lumineuse).
Errata Cours 5: Le test d'intersection rayon-boite englobante oublie de tester si l'intersection est "positive". On peut facilement vérifier si std::min(std::min(t_max_x, t_max_y), t_max_z) > 0 -- dans le cas contraire, la boite est derrière le rayon.
Deuxième erratum plus conséquent: un "off-by-one" dans la construction du BVH. L'arbre construit correctement est beaucoup plus rapide (environ 4x dans le cas du dragon - voire vidéo du Cours 7, partie Errata!). La condition d'arrêt peut s'écrire :