Développement d'un Raytracer

Introduction

Introduction

Monstres et Cie © 2002 Disney/Pixar

Salle obscure et comble, bien installé dans votre siége, popcorns en main, vous êtes plongés dans le film se déroulant sur la toile géante où Mike et Sulley se lancent leurs répliques. Un film banal me direz-vous. Exactement. A la seule différence que nos deux comparses Mike et Sulley ne sont pas des acteurs ordinaires. Ils ne sont autre que les héros du tout nouveau film d'animation pondu par le studio Pixar : Monstres et Compagnie.
Autrement dit deux acteurs purement virtuels, tout droit sortis des fermes de serveurs de rendu de Pixar.
Aprés Toy Story, 1001 pattes, Shrek et Final Fantasy, Monstres et Cie vient illustrer de façon poignante, la multiplication de la puissance de calcul des serveurs mais surtout l'avancée des techniques de rendu graphique.

Désormais les rendus graphiques dit "photoréalistes" sont partout. Aprés avoir envahi le monde des effets spéciaux du cinéma, de la publicité, du design, ils s'illustrent désormais pleinement dans des films d'animations comme ceux de Pixar ou plus récemment ceux de PDI/Dreamworks et Square Pictures.
La recherche dans ce domaine n'à jamais été aussi intensive qu'actuellement et d'aucun ne diront que l'imagerie de synthése, epaulée par des moteurs de rendu graphique de plus en plus puissants à un bel avenir tout tracé devant elle.


Les moteurs de rendu

Po
ur obtenir de tels rendus, ne croyez pas que les artistes utilisent 3DS Max ou même Maya pour calculer les images finales de l'animation. En effet les moteurs de rendu de ces logiciels ne sont pas adaptés, tant au niveau de la personnalisation du rendu final, qu'au niveau de la vitesse de calcul (qui n'est pas à negliger). Les artistes utilisent donc principalement Maya et Softimage pour modéliser et eclairer les scénes, puis les ces derniéres sont alors exportées hors du logiciel de modélisation, pour êtres finalement rendues sous Renderman qui est le moteur de rendu de Pixar, largemment utilisé dans le monde de l'industrie du cinéma et des films d'animation.

Les moteurs de rendu peuvent être de deux types. On distingue les moteurs qualifiés de "scanline renderer" (rendu par scanline), et les moteurs dit "raytracer" (lanceurs de rayon pour ne pas vexer nos académiciens).
Sans entrer dans le détail (rassurez-vous, nous aurons largemment l'occasion de nous y plonger), les moteurs de rendu par scanline vont calculer l'image finale pixel par pixel en
commencant en haut à gauche de l'image, pour finir en bas à droite (le chemin de parcours pouvant varier selon le moteur). Le calcul de l'image finale se fera si necessaire par plusieurs passes successives, pour par exemple simuler l'éclairage et d'autres effets.

Un raytracer n'est qu'une extension d'un moteur de rendu par scanline. Dans le sens qu'un raytracer va également calculer le rendu final pixel par pixel, cependant le calcul des refractions, reflections est fait en une passe et est exact, du fait qu'un raytracer va faire un calcul recursif (quand un rayon rentrera en collision avec un objet, deux nouveaux rayons seront émis : le rayon réfracté par l'objet (si il existe) et le rayon réfléchi (si il exite), et ainsi de suite), ce qui implique des temps de calcul considérables pour une précision inégalable.
Les moteurs de rendu par scanline sont beaucoup plus rapide que les raytracers mais donnent également des résultats beaucoup moins satisfaisants, du fait que les ombres, reflections, éclairages ... sont purement simulés.
A l'opposé un raytracer donnera des effets ultra réalistes pour la simple raison que le calcul de la lumiére et des autres effets seront exacts, se basant sur des formules physiques réeles, mais cela au depend de la vitesse de rendu (on ne peut pas avoir le beurre et l'argent du beurre).

Heaven 7 - 2000 Exceed

Les logiciels de modelisation comme 3DSMax, Maya, Lightwave, utilisent à la fois des moteurs de rendu par scanline et des raytracers. En effet lorsque dans 3DS Max vous visualisez une preview de votre scéne dans un des viewports, vous avez à faire sans le savoir à un moteur de rendu par scanline rapide. Par contre lorsque vous lancez le calcul du rendu final, c'est un raytracer qui prend le relai et commence son dur labeur.
Pour information sachez que les raytracers de rendus finaux sont propres à chaque logiciel de modélisation, et donnent des résultats différents sur une scéne identique (essayez donc de calculer une même scéne complexe au niveau de l'éclairage sous différents modeleurs et vous serez étonnés). Sans vouloir faire de favoritisme, le moteur de rendu de Lightwave est reconnu comme étant le plus puissant de tous les logiciels de modélisation.

Loin de se limiter aux seuls raytracers des logiciels de modélisation, des centaines de raytracers sont disponibles sur le net, la plupart payants, et peuvent être utilisés comme plugins de rendu pour remplacer les moteurs de rendu par défaut des principaux modeleurs du marché.

Le moteur de rendu Renderman de Pixar, lancé en 1989 et qui n'a cessé d'évoluer depuis, effectue quant à lui un rendu par scanline, pour la simple et bonne raison qu'un raytracer demande énormément de temps de calcul, et malgrés les fermes de serveurs démesurées utilisées par les studios de production, le temps de rendu reste considérable du fait de la résolution demandée, et attendre 50 ans avant d'avoir la copie finale du film n'est pas vraiment trés intéréssant ,)
Un rendu par scanline pour une telle qualitée, l'auteur de cet article essaierais-t-il de m'embrouiller ? me rétorquerez-vous. Que nenni ! L'astuce dans ce cas réside dans le fait que sur les effets speciaux d'un film ou même sur un film d'animation, les images defilent tellement vite qu'il n'est pas nécéssaire d'avoir une qualitée de rendu hors du commun pour chaque image.
De plus pour obtenir une qualitée de rendu optimale, Renderman à développé un systéme de shaders trés puissant qui permet réellement de personnaliser le rendu final à sa guise.

Pour finir nous pouvons également préciser qu'il existe plusieurs types de moteurs : des moteurs temps réel, comme par exemple des raytracers temps réel (qui sont bien souvent en fait des moteurs de rendu par scanline et non des raytracers) qui calculent le rendu aussi rapidement que possible pour pouvoir assurer une visualisation en temps réel (la démo Heaven 7 de Exceed en est un exemple parfait), et des moteurs de rendu non temps réel comme ceux utilisés dans le calcul d'images et de films, qui prennent des minutes voire des heures pour calculer une unique image avec une précision et une qualitée incroyable.


Autour de ce dossier

Dans ce dossier, qui sera en fait une série d'articles sous forme de tutorials, nous verrons comment développer un raytracer non temps réel.
Nous étudierons dans un premier temps les bases même du raytracing et avancerons doucement mais sûrement vers des concepts beaucoup plus évolués.

Final Fantasy © 2001 Square Pictures

Chacun des articles sera accompagné d'un code source C++ commenté et documenté Doxygen (je ne peux que vous conseiller la lecture du dossier réalisé par Martin Korolczuk sur Doxygen [lien en bas de page]), afin d'illustrer pratiquement les concepts évoqués et développés dans l'article. Bien sûr ce code source ne constitue qu'un complément aux articles, et je vous conseille de vous y réferrer uniquement quand vous aurez bien assimillé les techniques énoncées dans l'article. Je dirais même que rien ne vous oblige à consulter les sources, et cela ne devrait être fait qu'en dernier recours ,)
En effet du copier/coller du code source complet sans rien n'avoir compris n'est pas vraiment trés intelligent et ne vous sera pas utile.
Le code source de base evoluera au fil des articles, et au bout de quelques articles nous aurons déja un raytracer conséquent fonctionnel, le but final étant d'avoir un raytracer puiss
ant, modulaire, compétitf et rapide, intégrant les toutes derniéres decouvertes en la matiére.
Cependant ne vous leurrez pas, le développement d'un raytracer de base est assez rapide, mais l'intégration de tecchniques de pointe prend beaucoup de temps, pire encore si votre raytracer de base n'est pas architecturé correctement (chose qui n'arrivera sûrement pas, si vous suivez ces articles à la lettre ,)).
Cependant si vous êtes en train de lire ce dossier, j'estimes que vous avez envie d'apprendre et de developper un raytracer et que vous êtes conscient du temps que cela pourra prendre sur vos autres projets. Croyez moi le raytracing monte vite à la tête, et vous tomberez vite sous son charme ;)
Au niveau du rythme de parution des articles, il sortira un nouvel article toutes les deux semaines (comptez trois semaines si votre serviteur est en galére :p).
Je ne sais absolument pas encore combien d'articles cette série comptera, mais tant qu'il y aura des choses à dire, et tant que je serais sur ce projet, il y aura des articles.


Pourquoi un Raytracer ?

En cette époque où les moteurs 3D temps réels pululent et où les 99% des IOTD (Image Of The Day) sur flipcode ne sont autres que des moteur de terrain temps réel, des moteurs 3D, des moteurs de particules, ou même encore des raytracers temps réel, il peut paraitre étrange de développer un raytracer non temps réel.
Cependant il est bon de noter que la réalisation d'un raytracer permet de découvrir la 3D à sa base, sans passer par des routines de haut niveaux utilisées en temps réel comme par exemple sous DirectX ou encore OpenGL. La où en hardware, grâce aux SDK, les principales structures 3D sont déja prémachées, et les calculs mathématiques de bas niveau masqués, dans un raytracer software il vous faudra plonger les mains dans le camboui et etudier le fonctionnement 3D à sa source. Je tiens à signaler qu'aucune librairie ne sera utilisée pour le raytracer en lui même, et que de ce fait, il sera trés portable que ce soit sur le plan du systéme d'exploitation que sur celui du langage.

Shrek © 2001 PDI/Dreamworks

De plus de nombreuses techniques complexes utilisées en raytracing, notamment le calcul de l'éclairage global que nous étudierons à un stade plus avancé, peuvent être intégrées par la suite dans des moteurs 3D temps-réel en pre-process par exemple pour le calcul de lightmaps pour ne citer que ce point. De plus aprés avoir réalisé un raytracer bien architecturé vous aurez beaucoup plus de facilités à réaliser un moteur 3D accelleré grâce à un SDK (DirectX ou OpenGl).

Sans compter le fait que nous intégrerons à notre raytracer sûrement par la suite le support des shaders Renderman (ce ne sera pas une partie de plaisir, mais nous aurons déja acquis de nombreuses connaissances avant de passer cette étape). A ce niveau, vous aurez votre propre raytracer supportant les shaders renderman, autant dire que la création de shaders renderman ne sera plus un secret pour vous. Et moi de rajouter que la programmation de shaders renderman est trés recherchée par les principals studios de l'industrie du cinéma et d'autres sociétés utilisant Renderman (et elles sont nombreuses). Toujours un plus sur votre CV si vous envisagez de travailler dans ce domaine.
Je pourrais également rajouter qu'un raytracer peut constituer un projet à part entiére dépassant le simple rendu graphique. En effet rien ne vous empéche par la suite de développer un moteur réseau pour le calcul réparti, ou encore un GUI vous permettant de visualiser le rendu au fil du calcul et de configurer le rendu ou pourquoi pasencore un langage de scripting pour votre raytracer. Bref les possibilités sont infinies et le développement d'un raytracer, intéréssant au début, finira vite par vous passionner (l'auteur de cet article ne se porte en aucun cas responsable des nuits blanches pouvant suivre la lecture de ses articles).
Bref dans tous les cas vous ne pourrez qu'y gagner :)

Liens

PDI/Dreamworks
Le web de PDI/Dreamworks, le studio d'animation à l'origine de Shrek et Fourmiz (et bientôt Shrek2).
http://www.pdi.com

Square
Le site web de Square, les auteurs de la serie des Final Fantasy et du film d'animation du même nom.
http://www.squareusa.com

Pixar official website
Le site web officiel de Pixar. Vous y trouverez de nombreuses informations sur les films de Pixar ainsi que sur Renderman.
http://www.pixar.com

Discreet
Site web du développeur du modeleur 3DS Max, trés utilisé dans les jeux vidéos par exemple.
http://www.discreet.com

Alias/Wavefront
Site web du
développeur du modeleur Maya, largemment répandu dans l'industrie du cinéma.
http://www.aliaswavefront.com

Softimage
Site web officiel du modeleur softimage, rolls du modeling, utilisée dans les plus grand studios de cinéma pour les effets spéciaux.
Vous trouverez également sur ce site, des informations sur Mental Ray, un moteur de rendu concurent de Renderman.
http://www.softimage.com

Newtek
Site web des développeurs de Lightwave, un logiciel de modeling trés performant pour un prix plus que raisonnable.
http://www.newtek.com

Exceed Demogroup
Le site web du groupe de démo Exceed, créateurs de l'intro Heaven 7 utilisant un moteur de raytracing temps réel.
http://www.inf.bme.hu/~exceed

Doxygen : contrôle anti-dopage positif
Excellent article en francais sur l'installation et la configuration de Doxygen, un outil permettant de générer de la documentation à partir du code source.
http://www.alrj.org/docs/outils/DoxyDop.pdf

Flipcode. Daily Game Development News & Ressources
Site web anglophone en rapport avec le développement de jeux vidéos. De nombreux articles techniques, ainsi qu'une section IOTD (Image Of The Day) trés appréciée.
http://www.flipcode.com

POV-Ray - The Persistence Of Vision Raytracer
Site web sur un des premiers raytracers qui plus est totalement gratuit et opensource. Beaucoup d'informations générales sur le raytracing. En anglais.
http://www.povray.org

A propos de l'auteur

Benoît Lemaire est actuellement étudiant en troisiéme année d'informatique, à l'UTBM (Université de Technologie de Belfort Montbeliard). Passionné de programmation et plus particuliérement par la programmation 3D, il travaille en ce moment sur un raytracer non temps réel complexe, aprés avoir travaillé sur quelques projets 3D temps réel. Loin d'être un grand expert en la matiére, il à néammoins désiré écrire cette série d'articles afin de faire partager son éxpérience au plus grand nombre, aprés avoir constaté un manque notable d'articles techniques concernant le raytracing sur Internet.

Remerciements

Je tient à remercier tout particuliérement John Van Der Burg qui m'a été d'un grand soutient autant moral que technique sur ce projet.

Un grand merci également à Jean Michel Hervé (tuo ou tuette pour les intimes) pour m'avoir grandemment aidé dans mes débuts en 3D accéllérée sous DirectX.
Merci également à Patrice Kristofak (patrox) pour ce stage à Atlanta chez PTI International que je n'oublierais jamais et pour son amabilité et sa gentilesse.
Sans oublier tous les habitués de #codefr, #demofr et plus récemment les accros au thé du #salon2the.
Je suis à votre entiére disposition pour toutes vos questions concernant ce dossier, vous pouvez me joindre par e-mail à darkwolf2@wanadoo.fr et sur ICQ au 14261556 .
Bonne chance à tous et amusez-vous bien !




© Benoît Lemaire alias DaRkWoLf 2002. All Rights Reserved. Unauthorized modification/distribution forbidden.