Lancer de rayons minimaliste

Contexte

Ce petit programme écrit en Pascal entre 1996 et 1997 est le résultat de mon Travail d’Initiative Personnelle Éncadrée (TIPE) en classe préparatoire aux grandes écoles dont le thème général était l’Infographie. Parmi le large spectre des sujets possibles, la génération d’image de synthèse m’a amené à comparer les modèles de rendu et d’éclairement pour finalement décider d’écrire un « lancer de rayons » (ray-tracing en anglais).

Principes

Les principes d’optique géométrique permettent de modéliser le trajet de la lumière sous la forme d’un code de « lancer de rayons ». Pour chaque point d’un écran virtuel placé devant une caméra, le programme remonte la trajectoire d’un photon (toute mécanique quantique est exclue ici) qui aurait atteint la caméra. À chaque intersection avec un objet, le calcul des rayons incidents suivant les principes de réflexion et de réfraction pour les surfaces non-opaques permettent de définir la couleur et la luminosité du point. L’ombrage est obtenu par ajout d’un calcul d’intersection du segment entre le point d’impact et chaque source lumineuse avec les objets de la scène.

Concernant la texture des objets, une perturbation du vecteur normal à la surface permet de modifier le rendu (lisse ou rugueux), et une fonction de calcul permet de réaliser de définir la couleur dans le volume et non pas simplement en surface.

Afin de disposer d’objets plus complexes que les plans et les sphères, j’y ai ajouté la représentation de surface implicite à partir de fonction f(x,y,z)=0. Par exemple, une sphère de centre (a,b,c) et de rayon r est la représentation de la surface correspondant aux points (x,y,z) qui vérifient (x-a)³+(y-b)³+(z-c)³-r³=0.

Historique

À l’origine écrit en Turbo Pascal 7.0 avec orientation objets pour s’exécuter sur DOS, le programme fonctionnait aussi sous Windows 95 avec Borland Delphi. La définition d’une scène se fait par l’intermédiaire d’un fichier de configuration texte, les objets disponibles étant implémentés dans le code Pascal.

  • En ligne de commande, la génération de la scène est exportée en image TGA, format choisi pour sa simplicité,
  • En mode DOS, une sortie à l’écran par appels BIOS à une carte VESA permettait de visualiser rapidement la scène,
  • Sous Windows, l’API Delphi était utilisée pour afficher l’image dans une fenêtre GDI – cette partie de code a probablement été perdue.

Pour ceux qui n’aurait pas de souvenirs de cette épique époque des peek et des poke – traduction pour le néophite: ces instructions machine permettaient d’écrire directement des octets en mémoire graphique, afin d’afficher une image sur Amstrad CPC – il faut quand même imaginer que la génération d’une image de 500 points sur 200 lignes pour une scène contenant une dizaine d’objets pouvait prendre plus d’une heure de CPU sur un vénérable 486DX à 66 MHz (turbo actif bien sûr) comme ceux qui équipait la salle informatique de l’école ou sur mon PC avec Pentium MMX première génération à 100 MHz. Évidemment il ne faut que quelques secondes aujourd’hui à nos machines cadencées en Gigahertz pour réaliser le même travail.

Usage

Afin de publier aujourd’hui ce code, seule la ligne de commande reste disponible, un petit correctif a été nécessaire pour rendre son exécution sur un Linux 64 bits possible. Rien n’aurait été possible sans le compilateur Free Pascal, qui a pris en charge mon code poussiéreux sans aucune modification – encore merci à leurs auteurs pour ce magnifique outil.

Une fois Free Pascal installé sur votre système favori, la compilation des sources du programme (tipe_raytracing_20091128) se fait simplement par la commande
fpc -Mdelphi src/Tracer.pas.
Pour générer une image, il faut soumettre la description de scène et le nom de l’image à générer en paramètres:
./src/Tracer examples/lemni.txt examples/lemni.tga

Pour créer votre propre scène, consultez la documentation des commandes de description.

Le résultat des exemples de scène est consultable sur ma galerie – avec le rendu actuel et les images de l’époque – car visiblement la précision des calculs et des outils de conversion d’image a un effet notable sur la génération (moindre luminosité, réflexion plus limitée, meilleur dégradé des couleurs). La dimension des images restent celles de l’époque car il faudrait redéfinir la distance entre la caméra et un écran virtuel de plus grande taille pour obtenir le même rendu de scène.

Ce programme n’a pas la prétention de générer des scènes réalistes, il s’agit simplement d’un démonstrateur de lancer de rayon à but pédagogique. Pour réaliser les films en image de synthèse, la puissance de calcul disponible actuellement permet aux outils d’appliquer différentes modélisations de rendu et d’éclairement spécialisées en fonction des objets (cheveux, tissus…) ou des textures (bois, métal, verre…) pour aboutir à de magnifiques résultats.

N’hésitez pas à me faire part de vos commentaires ou à proposer des améliorations.

Laisser un commentaire