MPIL(3I008)
Anne 2016/2017
Mini-projet : lancer de
rayons
Objectifs
1. Principe du lancer de rayons
2. Affichage graphique ou sauvegarde dimage
Le lancer de rayons (raytracing) est une technique de rendu
dimages de synthses fonde sur les lois de loptique. Elle
consiste dfinir une scne fictive forme dun ensemble dob-
jets et de sources lumineuses. Lobjectif est de synthtiser
limage que capturerait une camra place en un point de
cette scne. Cette image est forme par lensemble des rayons
qui se propagent dans la scne avant datteindre la camra.
En simulant le parcours inverse de ces rayons, il est possible
de dterminer la valeur prise par chaque pixel de la camra.
Pour cela, il faut trouver les intersections et calculer les in-
teractions des rayons simuls sortant de la camra avec les
diffrents objets et sources lumineuses de la scne.
Cette technique est une bonne approximation de lqua-
tion de rendu (Eq. 1) qui exprime la luminance nergtique
(radiance) L0 mise en un point x de lespace et dans une di-
rection w. Elle sexprime comme la somme de la lumire mise
Le et de la lumire rflchie qui est elle-mme la somme des
lumires Li venues de toutes les directions, corriges par la
capacit de rflexion de la surface et langle incident. Elle
permet donc dobtenir des images particulirement photora-
listes (comme celle de limage 1), mais est coteuse en temps
de calcul, au contraire dune mthode comme la rastrisa-
tion. Cest pourquoi le lancer de rayons est surtout utilis
pour les films en image de synthse, alors que les applications
qui ont des contraintes temps relles, comme les jeux vidos,
utilisent plutt la rastrisation. Le lancer de rayons permet
de reprsenter plus facilement les ombres, les rflexions, les
rfractions, les diffractions, et les diffusions de la lumire, ou
les caustiques.
L0(x, w) = Le(x, w)+
fr(x, w
, w)Li(x, w
)(w n)dw (1)
Figure 1 Exemple wikipdien dun rendu de lanceur de
rayons.
Dans le cadre de ce projet, nous souhaitons crer un lanceur
de rayons qui puisse grer des scnes complexes en nombre
dobjets. La premire partie du projet consiste crer une
version de base qui gre des phnomnes physiques simples
pour un petit nombre dobjets dans la scne, et affiche ou
enregistre limage de rendu.
Le projet pourra tre programm en OCaml, F# ou en
Swift. Il devra tre soigneusement document et test. Une
attention particulire sera accorde larchitecture du code.
Il faudra fournir un Makefile o make compilera le projet et
./raytracer-demo (sans arguments) lancera une dmo du
programme. Vous pouvez supposer que nous avons install
ocamlbuild. Votre programme doit tre multi-plateforme, ou
au moins fonctionner sous Mac et Linux.
Exercice 1 : Manipulation de vecteurs
La modlisation de la scne reprsenter ncessite la ma-
nipulation de points et de vecteurs dans un espace en trois
dimensions.
Q.1.1 Dfinissez des types points et vecteurs. Vous pouvez
utiliser des tableaux, ou des records.
Q.1.2 Dfinissez les oprateurs suivants entre vecteurs : ad-
dition, soustraction, multiplication par un scalaire, produit
scalaire, produit vectoriel, norme et normalisation. Nhsitez
pas dfinir ces oprateurs comme oprateurs infixes pour
les plus utiliss.
Exercice 2 : Lancer de rayons : visibilit
Le rendu dune scne est calcul depuis un certain point
de cette scne, appel camra. Pour commencer un rendu,
le lanceur de rayons calcule les objets visibles depuis cette
camra. On dit quun objet est visible par un pixel de la
camra sil ny a aucun obstacle le long du segment qui relie
lobjet au pixel. Un rayon est donc la donne dune origine
et dune direction. Les rayons envoys depuis la camra sont
appels rayons primaires.
Q.2.1 Dfinir le type dun rayon, form dune origine O (le
point depuis lequel le rayon est envoy) et dune direction d,
comme sur la Figure 2. La direction sera normalise (norme
de d gale 1). Une quation paramtrique du rayon est donc
P = O+ t d o t 0 et P est un point sur le rayon. Un rayon
est donc une demi-droite.
O
d
P
|
|
|
|
t
Figure 2 Schma dun rayon dorigine O, de direction d,
avec un point P tel que P = O + t d
Q.2.2 Dans cette question, nous dfinissons la camra
(lappareil-photo, ou lil) qui va prendre une image de la
scne 3D. Il existe de nombreuses varits de camras mais
nous allons considrer un modle simple : une camra ponc-
tuelle. Le passage du monde 3D de la scne au monde 2D de
limage avec une telle camra est appele perspective linaire.
La camra est dcrite entirement par son origine, les dimen-
sions de lcran, le champ de vision (en radian, langle entre
les cts gauche et droit de la camra) et le point de vise,
cest–dire le point situ au centre de lcran. Dfinissez le
type dune telle camra.
1
camra
O d
P
|
|
|
|
C
cran
Figure 3 Schma dune camra avec un champ de vision
, un cran de rendu et une sphre. C est le point en bas
gauche de lcran et P le point de vise de lcran pour le
rayon de direction d.
Q.2.3 Chaque rayon est envoy depuis la camra et passe par
le milieu de chacun des pixels de limage. Il va donc falloir
convertir des coordonnes de lespace discrtis et en deux
dimensions de limage, celui du monde en 3 dimensions.
crivez la fonction qui lance les rayons primaires, et qui prend
une camra en entre. A ce stade, la fonction ne fait rien
dautre que de calculer successivement pour chaque pixel de
limage le rayon sortant. Ces rayons ne sont pour linstant pas
utiliss, mais la fonction sera complte ultrieurement pour
dcrire leur manipulation.
Une faon de faire (voir Fig. 3) : si la camra a pour origine
O, pour point de vise P , comme champ de vision et que
lon veut une image de dimensions (w, h), alors la direction
de la camra est
OP et les vecteurs u, v qui dterminent les
directions de lcran (si on considre une direction verticale
arbitraire up de coordonnes (0, 1, 0)) sont :
u = up
OP
v =
OP u
Dfinissons quelques paramtres intermdiaires :
image_ratio =
h
w
half_width = image_ratio tan(
2
)
half_height = tan(
2
)
Ensuite, nous calculons le coin en bas gauche de lcran C,
et deux vecteurs qui permettront de parcourir lcran x, y.
C = P half_width u half_height v
x =
2 half_width
w
u
y =
2 half_height
h
v
On en dduit la direction
OQ dans lespace pour le point qui
correspond aux coordonnes (xe, ye) sur lcran :
Q = C + xe x+ ye y
Q.2.4 Dfinir le type dune sphre.
Q.2.5 Nous cherchons savoir si un rayon intersecte une
sphre prsente dans la scne. Lquation implicite dune
sphre de centre C = (xc, yc, zc) est donne par (xxc)2+(y
yc)
2 +(z zc)2 = r2. Le rayon a pour quation paramtrique
P = O + t d cest–dire :
x(t) = xo + t xd
y(t) = yo + t yd
z(t) = zo + t zd
Son intersection avec un rayon peut donc tre dtermine en
dveloppant puis rsolvant lquation du second degr suivant
le paramtre t :
(x(t) xc)2 + (y(t) yc)2 + (z(t) zc)2 = r2
crire une fonction intersect qui renvoie la distance la
camra en cas dintersection, ou bien + sil ny a pas din-
tersection.
Q.2.6 Modifier la fonction qui lance les rayons de la camra
pour quelle prenne une liste de sphres en paramtres, et
quelle utilise intersect . En cas de plusieurs intersections pour
un mme rayon, on ne gardera que lintersection avec la sphre
la plus proche.
Exercice 3 : Affichage
Q.3.1 Affichez lcran votre rendu. On affichera en blanc
les pixels visibles, cest–dire ceux pour lesquels leur rayon a
rencontr un objet, et en noir ou en bleu ciel les autres (voir
Fig. 4).
Figure 4 Affichage dune sphre de centre (0, 0, 1) et de
rayon 0.4 avec une camra place lorigine, qui regarde vers
le point (0, 0, 5) avec un champ de vision de 8
3
et une image de
taille 700 500. Le fond noir a t remplac par des hachures
pour sauver lenvironnement
En OCaml, on pourra utiliser la bibliothque Graphics, qui
est fourni par dfaut. En F#, vous pouvez utiliser les compo-
sants graphiques .Net ou GTK# ou mme faire de linterop-
rabilit et faire linterface graphique en C#. En Swift, vous
pouvez utiliser des composants OS X ou bien interfacer avec
une librairie C externe. Vous pouvez aussi gnrer une image
sur le disque : un format simple, textuel, pour reprsenter des
images, est le format ppm.
Exercice 4 : Lancer de rayons : illumination
Une fois la visibilit de lobjet dcide, il faut calculer la
couleur du pixel, en propageant le rayon vers les autres ob-
jets et les sources de lumire. Ces nouveaux rayons sont ap-
pels rayons secondaires. Ils peuvent tre des rayons dombre,
des rayons de rflexion, des rayons de rfraction etc. On com-
mence ici par un modle simple, le modle de Blinn-Phong.
Le modle de Blinn-Phong dcompose la rflexion dun
point entre trois composantes (voir Fig. 5) :
2
Figure 5 Les trois composantes du modle de Blinn-Phong
(source : Wikipdia)
1. composante ambiante : Ia,
2. composante diffuse : Id,
3. composante spculaire : Is.
La composante ambiante reprsente la luminosit moyenne
qui rgne dans la scne. La composante diffuse correspond la
rflexion de la lumire sur une surface irrgulire 1 et la com-
posante spculaire, la rflexion sur une surface brillante :
cela correspond aux taches de lumire sur un objet.
Lillumination totale en un point de la scne est la somme
des trois contributions :
I = Ia + Id + Is
Ia (respectivement Id et Is) sexprime en fonction dun co-
efficient 2 not ka [0, 1] (respectivement kd et ks). Les 3
composantes dpendent galement dun paramtre qui cor-
respond la brillance du matriau 3.
Le but des questions suivantes et dimplmenter le calcul,
dtaill dans la suite de lnonc, des trois composantes dillu-
mination.
Q.4.1 Dfinir un type pour reprsenter une couleur, puis
un type pour reprsenter le matriau avec lequel est fait un
objet. Un matriau sera compos dune couleur (r, g, b), des
trois coefficients ka, kd et ks valeurs dans [0, 1] et de .
On peut dduire de ces valeurs les paramtres du modle de
Blinn-Phong par couleur. Par exemple, krouged = kd
r
255
si
vous reprsentez les couleurs par des valeurs entre 0 et 255.
Q.4.2 Nous allons ici modliser des sources primaires de
lumires simples : des lumires distantes, comme le soleil. On
considre que les rayons mis par ces sources sont tous envoys
dans la mme direction. Ces sources ont aussi une couleur et
une intensit qui est la mme en tout point de lespace. Dfinir
le type dune lumire distante qui contient donc une direction,
une couleur et une intensit. Modifiez la fonction principale
de lancer de rayons pour faire en sorte que lon puisse rajouter
une lumire dans la scne.
Vous pouvez aussi ajouter des sources primaires de lumire
ponctuelles et anisotropes (cest–dire qui diffusent la lumire
dans toutes les directions). Pour celles-ci, lintensit dcrot en
4d2 o d est la distance entre le point illuminer et la source
ponctuelle. Attention, choisissez une trs grande intensit de
dpart, sinon, vous risquez dobtenir une image toute noire.
Q.4.3 Lclairage ambiant est calcul comme une contribu-
tion de toutes les lampes de la scne. Vous pouvez commencer
par un modle trs simple : la composante ambiante en un
1. On parle de microfacettes. La lumire se diffuse sur la sphre.
2. Le coefficient peut tre rendu dpendant de la frquence de la
lumire, et donc de la couleur
3. Plus est grand, plus la tache de lumire sera petite.
point dun objet est le produit de son coefficient kobjeta par
une constante ia commune toute la scne. Soit :
Ia = k
objet
a ia
Attention, il faut bien garder lesprit quici Ia est un vecteur
dont chaque composante est associe une couleur. ia = 0.2
fonctionne bien.
crire une fonction illuminate qui calcule les trois compo-
santes (r, g, b) dun pixel en prenant en compte lclairage
ambiant.
Q.4.4 Modifier la fonction intersect pour quelle renvoie aussi
la normale la sphre au point incident. Nous aurons besoin
de la normale pour calculer les composantes diffuses et sp-
culaires. La figure 6 dcrit les vecteurs ncessaires au calcul
de lillumination dans le modle de Blinn-Phong, ce qui sera
ncessaire galement pour les questions suivantes.
Objet
Objet 2
Soleil
Camera
Ombre !
LlightN
V
Figure 6 Schma dune sphre avec les vecteurs Llight , N ,
V ncessaires pour le modle de Blinn-Phong, ainsi que pour
les rayons dombre. H pour des raisons esthtiques.
Q.4.5 Lclairage diffus (ou lambertien) Id est obtenu, dans
le cas dune source distante, selon la loi :
Id = kd (Llight N) i
o Llight est le vecteur normalis du point dintersection de la
surface la source de lumire, N la normale la surface au
point dintersection, et i lintensit de la lumire incidente. On
rappelle que pour une source non distante, il faudrait prendre
en compte la dcroissance de lintensit en 4d2.
Modifiez la fonction illuminate pour quelle prenne aussi en
compte lclairage diffus.
Q.4.6 La relation de Blinn-Phong dcrit la composante sp-
culaire de la faon suivante :
Is = ks (H N) i
avec H = Llight+V
(Llight+V )
et V la direction vers lappareil-photo.
H est appel le demi-vecteur. Modifiez la fonction illuminate
pour quelle prenne aussi en compte lclairage spculaire.
Q.4.7 Des ombres apparaissent quand un obstacle se trouve
sur le trajet dune source de lumire. Rutilisez la fonction
3
Figure 7 Un rendu dune image basique avec deux sphres
et un carr de 28 sphres de ct. Lclairage est donn par
deux lampes distantes.
dintersection entre un rayon et une sphre pour savoir sil y
a un obstacle. Le nouveau rayon part du point dintersection
courant et a pour direction la direction oppose la propa-
gation de la lumire. Sil y a intersection du rayon de lumire
avec un obstacle, alors le point illuminer sera noir. Sinon,
nous utilisons le modle de Blinn-Phong pour illuminer le
point.
Exercice 5 : Scne dmo
Q.5.1 Votre programme ./raytracer-demo doit faire le
rendu dau moins deux sphres, avec une lampe, de faon
voir au moins une ombre dune sphre sur lautre. Un exemple
de rendu se trouve en Figure 7.
Q.5.2 crivez une fonction permettant de faire le rendu
dun carr de sphres de rayons r accoles centr en un point
donn en argument, avec 2n sphres de rayon r par ct. Vous
pouvez lintgrer la scne de dmo.
Facultatif bonus
Q.5.3 Il sagit ici de grer plusieurs sources de lumires.
Chaque source de lumire apporte linairement son clairage
la scne. Cela signifie quil suffit dadditionner les contribu-
tions de toutes les lumires au moment du calcul de lillumi-
nation.
Vous devriez retrouver le mme rsultat en rendant plu-
sieurs images sparment pour chaque lampe puis en superpo-
sant ces images, par exemple avec Photoshop ou The Gimp.
Q.5.4 Vous pouvez voir que les objets de la scne sont cr-
nels ; cela se voit encore mieux en zoomant sur votre rendu.
Nous pouvons dvelopper une forme danti-crnelage simple,
par sur-chantillonnage. Pour chaque pixel de limage, calcu-
lez les couleurs de n > 1 pixels puis moyennez.
Ce qui vous attend dans la partie 2 Testez votre carr
de sphres avec 500 sphres de ct. Le rendu prend beau-
coup de temps ! Pourquoi ? Dans la partie 2, nous verrons
des techniques pour amliorer les performances, par exemple,
lutilisation de structures hirarchiques, ou la paralllisation
des calculs.
Nous amliorerons aussi le modle physique avec les r-
flexions par exemple et nous ferons en sorte de reprsenter
des scnes avec des objets plus complexes.
*
Rfrences
[1] Pharr, Matt and Jakob, Wenzel and Humphreys, Greg,
Physically based rendering : From theory to implementa-
tion. Morgan Kaufmann, 3rd Edition, 2016
4
Reviews
There are no reviews yet.