← Tous les projets

Science

Lancer de rayons

Rendu par lancer de rayons des maillages du fil rouge, en C++ compilé en WebAssembly, utilisable en ligne.

Terminé Sprint S33-S34 · 8 points
En bref, sans jargon pour les non-informaticiensLire le résuméRefermer
Ce que c'est
Un programme qui fabrique des images réalistes d'objets 3D en simulant le trajet de la lumière (reflets, transparence, ombres douces), directement dans la page.
À quoi ça sert
C'est la technique des films d'animation et des images d'architecture.
Ce que ça montre
La maîtrise du rendu d'images, au cœur de l'informatique graphique, avec un calcul réparti sur tous les cœurs du processeur.
Code source

Comment les morceaux tiennent ensemble

Schéma : lib-c → Moteur (OBJ, PLY, STL) ; Moteur → Ligne de commande (rendu natif) ; Moteur → WebAssembly ; WebAssembly → Web workers ; Web workers → Fiche du site (passe après passe). OBJ, PLY, STL rendu natif passe après passe lib-c lecture des maillages Moteur C++, BVH, tracé de chemins Ligne de commande images de référence, PSNR WebAssembly interface C Web workers une bande chacun Fiche du site rendu progressif

Lancer de rayons dans le navigateur

Le moteur C++ de ce projet, compilé en WebAssembly, calcule l'image dans des web workers, un par cœur de calcul : chaque passe ajoute un rayon par pixel, l'image se précise sous vos yeux (ombres douces, reflets, réfraction du verre). Choisissez une scène ou votre propre maillage, une matière, puis tournez autour en faisant glisser l'image ou avec les curseurs.

ou le déposer sur l'image : il reste dans votre navigateur.

Lumière et matières

Une seule lumière sphérique, pas de caustiques ; 256 passes au plus. Les maillages sont ceux du projet Topologie 3D, lus par lib-c.

Gain mesuré avec plusieurs workers

Image de 480 x 270 pixels, scène des trois sphères, moyenne de 8 passes (meilleur de trois essais), même module WebAssembly et mêmes bandes que la page, dans des threads Node ; processeur Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz, 12 threads.

WorkersTemps par passe (ms)Accélération
146,8× 1,00
225,1× 1,86
414,5× 3,23
811,6× 4,03

Au-delà de 4 workers, le gain ralentit : ce processeur n'a que 6 cœurs physiques, les autres threads partagent leurs unités de calcul. Dans votre navigateur, le temps par passe s'affiche sous l'image ; changez le nombre de workers pour comparer.

Captures haute définition

Rendues par le moteur natif (le même code C++, compilé pour le processeur) en 640 × 360, 256 passes, par scripts/captures.mjs.

Technologies

  • C++
  • WebAssembly
  • Emscripten
  • CMake
  • GoogleTest

Qui fait quoi

C++
Le moteur : intersections, BVH découpée selon la surface (SAH), tracé de chemins, matériaux, réglages de la lumière.
WebAssembly
Le moteur tourne dans le navigateur, réparti sur plusieurs web workers, sur la fiche.
Emscripten
Compile le C++ et le lecteur de lib-c en WebAssembly, version épinglée ; la CI vérifie le build octet pour octet.
CMake
La compilation native et les tests sur Linux, Windows et macOS, avec ASan et UBSan.
GoogleTest
Les tests de physique (fournaise blanche, irradiance analytique), la BVH contre la force brute, les images de référence.

Definition of Done

  • Code relu, diff par diff
  • Tests unitaires et d'intégration verts
  • CI verte sur Linux, Windows et macOS si compilé
  • README, REVIEW.md et DECISIONS.md à jour
  • Textes en français et en anglais
  • Démo déployée et testée sur mobile