Page cover

Lanceur de rayon

L'objectif de ce hackathon est de vous initier à l'ingénierie d'un logiciel avancé. Dans votre carrière de Tech-Lead/CTO, on vous demandera de concevoir et de développer des logiciels qui vont au-delà d'un simple site web ou d'une application web avec une base de données et des appels API.

En tant qu'ingénieur logiciel, on vous demandera souvent de modéliser un principe scientifique, un principe mathématique, d'émuler des comportements basés sur la physique. Tout cela dans le but de créer un outil utile pour vos clients. Cette tâche peut souvent s'avérer décourageante :

  • vous devrez apprendre, comprendre les concepts mathĂ©matiques, physiques ou autres concepts techniques qui sont en dehors de votre zone de confort

  • vous devrez traduire ces concepts dans votre domaine : structures de donnĂ©es, algorithmes, architecture, ....

  • vous devrez surmonter les problèmes de performance

  • vous devrez fournir un produit qui soit rĂ©ellement utile Ă  votre client

Pour ce projet, nous vous jetons dans le grand bain et vous demandons de concevoir un logiciel mathématique complexe ! Ce n'est pas parce que nous sommes sadiques, il y a en fait un certain nombre de compétences vraiment importantes et utiles qui devraient résulter de cet exercice :

  • la capacitĂ© Ă  traduire un principe mathĂ©matique en un problème d'ingĂ©nierie

  • Choisir et mettre en Ĺ“uvre de bonnes structures de donnĂ©es, des modèles de conception, et adopter une architecture propre.

  • l'ajout d'un langage de programmation Ă  votre boĂ®te Ă  outils (si vous ne connaissez pas dĂ©jĂ  le C++)

  • ĂŠtre confrontĂ© Ă  de sĂ©rieux problèmes d'optimisation et essayer de trouver des solutions.

  • Vous efforcer de crĂ©er une expĂ©rience utilisateur agrĂ©able.

Il s'agit d'un projet de groupe, et par conséquent, en tant que futur Tech-Lead/CTO, vous devrez également pratiquer et affiner vos compétences non techniques, mais néanmoins essentielles :

  • travailler et coordonner avec d'autres dĂ©veloppeurs (planification, dĂ©lĂ©gation, synchronisation, rĂ©solution de conflits, ...). Vous ĂŞtes libre d'utiliser la philosophie de gestion de projet que vous souhaitez (Agile, Scrum, Kanban, ...).

  • travailler avec un dĂ©pĂ´t GIT centralisĂ©

  • rĂ©vision du code entre collègues

Le projet : un "ray-tracer"

Nous sommes en 2035. L'IA et le Chat-GPT ont détruit le marché des compétences techniques. Une génération entière de développeurs « copier-coller » a donné naissance à une multitude de versions de logiciels défectueux. Les géants du rendu d'images par ordinateur sont à genoux. Adobe et Autodesk ont fait faillite. Blender est devenu inutilisable.

Les principaux studios de cinéma 3D en images de synthèse sont désespérés - ils ont besoin de leurs logiciels pour produire leur prochain film et n'ont nulle part où aller ! Heureusement, vous êtes là pour sauver la situation !

Votre mission est de créer, à partir des premiers principes, un traceur de rayons: un logiciel qui rend des images 3D en simulant la façon dont la lumière rebondit autour d'une scène.

Exemple d'une scène rendue par un raytracer basique avec 4 niveaux de réflexion. Il y a de la place pour l'amélioration !

Vous disposez d'une semaine pour réaliser ce logiciel. Les studios de cinéma exigent les fonctionnalités suivantes :

  • Rendre au moins une sphère et un plan avec une rĂ©flexion complète (c'est-Ă -dire une sphère totalement mĂ©tallique qui reflète son environnement), et produire une image unique au format PNG.

  • Vous devez ĂŞtre capable de rendre une image haute rĂ©solution d'une scène avec une grande quantitĂ© d'objets, et au moins 4 rebonds de lumière. Vous devez mesurer le temps de rendu et l'indiquer dans votre soumission finale. N'oubliez pas qu'un film est composĂ© d'une sĂ©rie d'images statiques. Votre logiciel devra donc rendre des centaines de milliers d'images pour crĂ©er le film. La vitesse de rendu est donc un facteur important pour le client !

  • Si vous y parvenez, vous obtiendrez un crĂ©dit supplĂ©mentaire pour l'un ou l'autre des Ă©lĂ©ments suivants :

    • La mise en Ĺ“uvre d'autres modèles de surface (Blinn, Phong, Gourad, Cook-Torrance).

    • Rendre d'autres formes, par exemple des cubes, des cylindres, des triangles

    • Le rendu d'un modèle 3D (au format .obj, .fbx, .collada ou autre)

    • StratĂ©gies d'optimisation du rendu :

      • partitionnement de l'espace

      • Multi-threading ou traitement parallèle

      • Utilisation du GPU

      • Multi-traitement (rendu sur un cluster, files d'attente, etc.)

    • Techniques de rendu de surface plus avancĂ©es : texture-mapping, bump-mapping, environment mapping, ...

    • Un langage structurĂ© de modĂ©lisation de la scène (un fichier d'entrĂ©e ?) spĂ©cifiant la disposition de la scène

    • Anti-crĂ©nelage

    • ...

Cependant, dans ce futur dystopique, il y a quelques contraintes ! Tous les langages de programmation modernes tels que Go, Python, Java, etc. sont devenus totalement propriétaires - pour les utiliser, vous devez payer d'énormes royalties, ce qui rendra ce projet irréalisable. Vous devez utiliser le seul langage libre restant : C++.

Heureusement, il y a quelques vieux sages qui peuvent transmettre des connaissances presque perdues sur ces logiciels fantastiques, qui ont été compilées dans ce guide. Lisez attentivement ces informations !

Travail d'équipe

Vous devez travailler en groupe de maximum 4 personnes. Merci de renseigner la constitution de vos groupes ici : https://docs.google.com/spreadsheets/d/15XxlY-hAXphluYYi91rkFycaz-DHESSliPAoS5DUFLo/edit?usp=sharing

Notation

On vous a demandé de construire un traceur de rayons à partir des premiers principes, en utilisant le langage de programmation C++.

Livraison et livrables

Vous devrez présenter votre logiciel le jeudi 31 octobre 2024. Vous devrez présenter les éléments suivants :

  • la ou les images rendues par votre logiciel

  • le temps total de rendu de votre (vos) image(s)

  • il vous sera demandĂ© de rĂ©aliser un rendu d'image en direct devant le client

  • vous devrez prĂ©senter et expliquer une partie de votre code

  • vous devez fournir un lien vers le projet GitHub

Notation

La notation est réalisée à la carte. Un produit de base fonctionnel (MVP) vous vaudra une note qui passe. Ensuite, vous êtes libre de mettre en œuvre toutes les techniques que vous souhaitez pour améliorer votre note, jusqu'à un maximum de 20 points.

La grille de notation suivante sera utilisée pour évaluer le projet :

Aspect
Note

Produit de base fonctionnel*

Un exécutable C++ fonctionnel

1

Une image PNG est produite

1

Au minimum, le rendu plat d'une sphère est réalisé

1

Au minimum, le rendu diffus d'une sphère est réalisé

2

Rendu d'un plan

1

Réflexions

2

Architecture C++ et qualité du code

Structures de données

1

Clean code

1

Algorithmes utilisés et correctement expliqués

1

Points supplémentaires

Les shaders de surface autres que les shaders diffus

3

Rendu d'autres formes

3

Rendu d'un modèle 3D (.obj, .fbx, ...)

3

Stratégie d'optimisation

jusqu'Ă  8 points

Techniques avancées de rendu de surface

3

Langage structuré de modélisation de la scène

2

Toute autre caractéristique suffisamment expliquée et mise en œuvre

3

Mis Ă  jour