Le rendu par lancer de rayons |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PRINCIPE
|
Algorithme de rendu pour l'obtention d'images de qualité photo-réaliste
Pour déterminer comment ils ont été créés, on suit en sens inverse le parcours des rayons lumineux qui s'impriment
sur la rétine de l'observateur.
On traite le rayon primaire partant de l’observateur et passant par chaque pixel de l'écran virtuel de manière à déterminer la couleur attribuée à ce pixel.
Lors du parcours d'un rayon lumineux dans une scène, deux cas sont possibles : (1) Aucun objet n'intercepte le rayon.
(2) Un ou plusieurs objets interceptent le rayon.
Phénomène récursif
Chaque intersection entre un rayon et un objet entraine le calcul de l'ensemble des rayons ayant pu générer ce rayon (diffusions, réflexion spéculaire,
transmission). On classifie les rayons en fonction de leur "rôle" au sein de la récursivité.
Calcul des différentes composantes
(a) Pour calculer la valeur diffusée on doit : (b) Pour calculer la valeur obtenue par réflexion on lance récursivement l'algorithme de lancer de rayons sur le rayon secondaire défini avec pour origine le point P et pour direction la direction de réflexion du rayon initial puis en pondérant la valeur obtenue par les coefficients de réflexion de la surface de l'objet.
Le rayon incident, le rayon réfléchi et la normale à l'interface au point d'incidence sont dans le même plan.
Les rayons secondaires de réflexion sont exclusivement tracés dans le milieu inter-objets. (c) Pour calculer la valeur obtenue par transmission on lance récursivement l'algorithme de lancer de rayons sur le rayon secondaire défini avec pour origine le point P et pour direction la direction de transmission puis en pondérant cette valeur par les coefficients de transmission de la surface de l'objet. Lors d'une réfraction, la direction du rayon incident est modifiée selon la loi de Snell : ni sin(qi) = nt sin(qt)
où ni est l’indice de réfraction du matériau dans lequel se propage le rayon incident, nt
est l’indice de réfraction du matériau dans lequel se propage le rayon transmis, qi est "l'angle
d'incidence" par rapport à la normale
Attention, les rayons secondaires de transmission sont tracés dans le milieu inter-objets mais aussi dans les objets "transparents".
En fonction de ni, nt et qi, la valeur de qt peut ne pas être définie (cas où le rayon incident fait un angle avec la normale suffisant pour ne pas être transmis et être totalement réfléchi (effet miroir)).
Indices de réfractions de matériaux courants Algorithme simplifié
/* Calcul et retour d'une image au moyen
*/ Inconvénients du lancer de rayons
Les calculs implantés sont obligatoirement réalisés en réel et font appel à des opérations mathématiques non triviales réalisées en grand nombre.
A chaque interception d'un objet par un rayon, outre les rayons d'ombre, on lance potentiellement deux rayons : un rayon pour la gestion de
la transparence et un rayon pour la gestion de la réflexion spéculaire. Pour obtenir un certain réalisme le niveau de récursivité doit être poussé assez loin (au moins 8, habituellement 10 à 12 voire 14) et donc les temps de calcul peuvent être très longs (plusieurs heures par image pour des scènes complexes).
L’illumination est "moyennement" locale. Ce problème peut être partiellement résolu en attribuant une composante de lumière ambiante à chacun des éléments de la scène (composante, souvent constante car on ne sait pas la calculer précisément avec l'algoritme de ray-tracing, ajoutée aux autres). Tel quel, le lancer de rayons ne peut pas restituer un effet de "caustique" tel que l'obtention d’une concentration ou d’une atténuation énergétique en certaines zones lors de la propagation de la lumière à l'intérieur d'une loupe. En effet, cet algorithme de rendu ne modélise que très imparfaitement les transferts d'énergie (la notion d'énergie par unité de surface n'est pas modélisée correctement).
On ne peut pas restituer la diffusion de la lumière dans les matériaux (en particulier l’air). Avantages du lancer de rayons
Des effets tels que les réflexions et les transparences sont restitués intrinsèquement. Aucun autre algorithme n'est capable de modéliser ces effets de manière aussi satisfaisante.
Les parties cachées sont éliminées de manière intrinsèque. Au niveau 1 de la récursivité, on est
en présence d’un algorithme très voisin du Z-Buffer dans ses résultats : le Ray Casting.
Pas de décomposition de la scène en facettes triangulaires ou surfaces élémentaires planes (contrairement au Z-Buffer). Les opérations de base utilisées sont les tests d'intersection objet<->rayon. Ces tests sont implantés au moyen des équations cartésiennes et paramétriques par résolution de systèmes d’équations. Classiquement les objets modélisant une scène affichée en lancer de rayons sont des objets représentables par équation(s) mathématique(s) : des sphères, des parallélépipèdes rectangles, des cônes, des surfaces contrôlées, … (affectés de rotations, translations, zooms). Bien entendu, on peut aussi aussi utiliser des ensembles de facettes.
Les rayons primaires sont indépendants les uns des autres.
Distribution des rayons primaires sur 4 processeurs Des ombres portées Des réflexions
Des transmissions à travers des billes d'indices de réfraction 1.333, 1.5, 2.5 et 4
Noter l'inversion des objets. Quelques problèmes mathématiques classiques Soient :
Sachant que abs(qi) = abs(qr), on établit :
Soient :
Si on pose n =
Ce qui nous conduit pour finir à
qui ne contient que des quantités connues. Calculs d'intersection On désire connaître la position de(s) l'intersection(s) entre un rayon lumineux quelconque et une sphère de rayon r centrée sur l'origine.
Le système d'équations à résoudre est formé de l'équation paramétrique de la droite définie par le rayon lumineux et l'équation cartésienne de la sphère :
Par substitution on obtient : (a1t + b1)2+(a2t + b2)2+(a3t + b3)2 = r2 (a12+a22+a32)t2 + 2(a1b1+a2b2+a3b3)t + b12+b22+b32 = r2 équation du second degré en t impliquant 0, 1 ou 2 racines et donc 0, 1 ou 2 intersections en fonction des conditions initiales.
On désire connaître la position de l'intersection (si elle existe) entre un rayon et une facette triangulaire connue par les coordonnées dans l’espace de ses trois sommets A, B et C.
On a donc : A =
B-A =
Le système à résoudre est
->
On doit résoudre ce système de trois équations linéaires à trois inconnues La solution est : D = -z1y3x2+y1z3x2+x3z1y2 +y3x1z2-z3x1y2-x3y1z2 D doit être différent de 0. Si D est égal à 0, le rayon est parallèle à la facette.
u = -(-y3x2zA-y3xPz2+y3x2zP+y3xAz2
v = (-x3z1yA-x3y1zP+x3z1yP+x3y1zA
t = (-xPz1y2+xPy1z2+xAz1y2-xAy1z2 Pour que le point d’intersection soit à l’intérieur du triangle ABC, il faut que :
Si on pose dx = xP - xA, dy = yP - yA, dz = zP - zA D = z1y3x2-y1z3x2-x3z1y2-y3x1z2+z3x1y2+x3y1z2
v = -
u =
t = - Les optimisations classiques mises en œuvre autour de l'algorithme du lancer de rayons portent sur trois facteurs clés :
Le calcul des intersections Le test d'intersection rayon-objet est l'opération de base de tout algorithme de lancer de rayon. Son optimisation pour les différents objets pris en compte permet des gains de temps substantiels.
Tout objet sera représenté sous la forme d'un objet canonique (exemple : le cube de centre O et de rayon 1.0 pour tous les parallélépipèdes rectangles) auquel on applique une matrice de transformation M en coordonnées homogènes. Test d'intersection avec un rayon R :
La réalisation d'un test d'intersection pour un objet canonique peut entraîner une charge de calcul importante (par exemple, pour le tore il n'y a pas de solution analytique mais uniquement des solutions numériques par approximations successives). En englobant strictement chaque objet dans une "boite" géométrique simple (de test d'intersection simple), définie en coordonnées globales, on pourra réaliser une économie substantielle car un rayon qui ne touche pas la boite ne pourra pas toucher l'objet qu'elle contient.
Le nombre de calculs d'intersections L'acquisition de connaissances sur la position des objets à l'intérieur de la scène peut éviter la réalisation obligatoire d'une recherche systématique d'intersection lors du test d'un rayon vis à vis d'une scène.
Une technique classique consiste à décomposer l'espace en voxels et à associer à chaque voxel v la liste des objets partiellement ou totalement inclus dans v.
Plutôt que de parcourir séquentiellement tous les objets de la scène à la recherche de l'intersection la plus proche de la source d'un rayon, on analyse les listes d'objets associées aux voxels, voxel après voxel sur le trajet du rayon depuis le voxel d'émission. Sitôt qu'une intersection est trouvée, il n'est plus nécessaire de parcourir d'autres voxels car toute autre intersection est forcément plus éloignée du point d'émission.
Le nombre de rayons tracés Une solution simple pour diminuer le nombre de rayons primaires consiste à effectuer préalablement au lancer de rayon une projection des objets de la scène sur l'écran de visualisation. On saura ainsi quels sont les pixels en lesquels aucun objet n'apparaît. Le problème de la diminution du nombre de rayons secondaires est complexe et ne sera pas traité ici. Le lancer de rayons est correct du point de vue géométrique pour le placement des rayons lumineux à l'intérieur d'une scène. Il est en revanche beaucoup moins correct du point de vue énergétique car les phénomènes que l’on désire rendre relèvent de transports d’énergie, aspect que le lancer de rayons ne traduit que partiellement. Ces phénomènes sont beaucoup plus complexes que ceux que l’on peut modéliser par de simples calculs géométriques. Un avantage déterminant du lancer de rayons pour l'obtention d'images photoréalistes est toutefois que cet algorithme permet de rendre les réflexions et les transparences. Par rapport à un algorithme du Z-Buffer + Gouraud ou Phong, les images sont de bien meilleure qualité, mais les temps de calcul sont généralement considérablement plus longs (multipliés par 100, 1000 ou plus voire beaucoup plus). |