Le raytracing (info ici) est une technique de rendu d'image en 3D qui permet d'obtenir un résultat très réaliste. Ce réalisme vient du fait que pour chaque pixel de l'image à créer on calcule le chemin du rayon lumineux, en tenant compte des possibles réflexions, réfractions, diffusions, ...
Ce projet implémente un algorithme de raytracing en C++. La scène à rendre est décrite par un fichier XML. La scène se compose d'un environnement dans lequel différentes formes peuvent être placées (et combinées) et d'une caméra qui "photographie" la scène. Toutes les opérations sont effectuées par le CPU. L'image obtenue peut être sauvée dans les formats suivants : PPM (format natif), TIFF, PNG et JPEG.
La majeure partie des sources n'a pas été codée par moi directement, mais par deux élèves pour un projet de semestre en informatique. A l'époque (en 2004) j'étais assistant pour ce cours et j'ai été appelé à corriger plusieurs projets, dont celui-ci. J'ai été impressionné par sa complexité et sa complétude (le projet implémentait nombre de fonctionnalités non-requises dans l'énoncé du projet). J'ai donc décidé de conserver les sources, et d'ajouter petit à petit de nouvelles fonctionnalités (comme l'antialiasing), de nouvelles formes, ... J'ai également ré-implémenté un certain nombre de classes, changé notamment le parseur XML, ...
L'image est obtenue par le rendu d'une scène, qui est composée d'un environnement caractérisé par une couleur de fond, des sources lumineuses et un nombre variable d'objets. Ces objets sont définit par une forme, qui est définie par l'équation de sa surface et son champ de normales, et un matériau, qui détermine ses propriétés optiques. Pour chaque pixel de l'image à rendre, un rayon est lancé vers la scène, et les intersections avec les objets sont calculées par un solveur d'équation ad hoc (capable de résoudre algébriquement les équations de degré 1 à 4). Une fois l'intersection trouvée, il faut récupérer la couleur de l'objet (qui dépend du matériau), et lancer de nouveaux rayons vers les sources lumineuses plus les éventuels rayons réfléchi et réfractés. Le calcul d'un pixel peut donc produire le lancement d'un nombre potentiellement infini de rayons. Pour limiter ce nombre et réduire le temps de calcul, on ne calcule qu'un nombre donné de "générations" de rayons (càd en se limitant à 2 générations on se borne à lancer un rayon puis les éventuels rayons réfléchi et réfracté), la valeur par défaut est de 10 générations maximum. Les différentes source lumineuses créent la lumière nécessaire à la vision de la scène, en l'absence de source il fait "nuit" et l'image obtenue serait entièrement noire (plus précisément les objets apparaîtraient en noir et le reste serait de la couleur de fond de l'environnement).
Le projet supporte nativement des couleurs en 24 bits, il s'agit de la version originale du programme. J'ai implémenté également une version en 48 bits mais qui n'a encore jamais été testée complètement (pour des raisons évidentes de gestion des format PNG, JPEG et TIFF). Une couleur est décrite par ses trois composantes RGB (rouge, vert et bleu). Dans la version par défaut, chaque composante est un nombre entier compris entre 0 et 255. Pour la version 48 bits, chaque composante varie entre 0 et 65535.
Une fois les sources téléchargées, faire simplement un make dans le dossier où se trouve le makefile. Cette opération devrait créer deux exécutables : Raytrace++.exe et Raytrace++-batch.exe. Pour savoir comment utiliser ces programmes, se référer à cette page.
Wiki: AntiAliasing
Wiki: HowTo
Wiki: ListFormes
Wiki: ListMaterieaux
Wiki: ListSources