CASANAS Sylvain PASTOR Antoine PERCHET Frederic Ray-Tracing CASANAS Sylvain PASTOR Antoine PERCHET Frederic
Plan Principe Utilisation dans le Rendering Détection des collisions Diffusion de l’éclairage et des matériaux Réflexion et réfraction Conclusion Plan
#declare Box = union { object { Box_Front translate -z. 2 #declare Box = union { object { Box_Front translate -z*2.75} object { Box_Front scale <1,1,-1> translate z*2.75} object { Left_End translate -x*3.75 } object { Left_End scale <-1,1,1> translate x*3.75 } object { Box_Lid } object { Box_Bottom } } #declare Spheres = // Inside of box sphere { <1.5, 1.5, -0.75>, 1.25 texture { T_Wood14 finish { specular 0.35 roughness 0.05 ambient 0.3 } translate x*1 rotate <15, 10, 0> translate y*2 sphere { <-1.5, 1.25, 0.5>, 1 texture { T_Wood18 finish { specular 0.25 roughness 0.025 ambient 0.35 } scale 0.33 rotate <10, 20, 30> translate y*10 sphere { <-0.75, 1.0, -1.5>, 0.75 texture { T_Wood10 finish { specular 0.5 roughness 0.005 ambient 0.35 } rotate <30, 10, 20> 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. The ray tracing provides realistic reflection and refractions as well as shadows, while the scan line renders diffuse light and textures at high speed. 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). 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 ,) 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. Detection de collision avec des formes primitive pour détecter l’ordre dans lequel apparaissent les objets d’une scene Reflection, refraction, ombre Principe
Principe Permet le passage de la 3D à la 2D Moteurs de rendu : scan line / raytracer Temps réel / Non temps réel Permet la détection de collision Simule la diffusion de la lumière Raytracing Scanline Advanced Lighting Possible Slow More design control Need to cheat Shadows Easy Slower, less control Faster, more control Need separate pass Reflection Refraction Faster, More control Geometry Requires more memory Requires less memory 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. The ray tracing provides realistic reflection and refractions as well as shadows, while the scan line renders diffuse light and textures at high speed. 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). 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 ,) 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. Detection de collision avec des formes primitive pour détecter l’ordre dans lequel apparaissent les objets d’une scene Reflection, refraction, ombre Principe
Le rendering Qu’est ce qu’un rayon ? Un rayon possède 3 caractéristiques : Une position de départ O Un vecteur directeur unitaire DIR Une distance t L’équation d’un rayon est : R = O + DIR * t Le rendering
Le rendering Comment passer d’une scène 3D à une visualisation 2D ? Une caméra (Position+ Orientation) Un viewplan (Largeur+ Hauteur+ DistanceCam) Une résolution d’image (xRes + yRes) En fait ce rectangle imaginaire situé devant la caméra et correspondant à l'image finale, est appellé le viewplane. Il est representé dans la classe CCamera, par trois attributs : une largeur (viewplaneWidth), une hauteur (viewplaneHeight) et une distance (viewplaneDist ... la distance correspondant à la distance entre le viewplane et la caméra). Ces valeurs dépdendent du fov (field of vision), de la caméra, cependant nous allons assummer pour le moment que la largeur est de 0.35, la hauteur de 0.5 et la distance de 1.0. Le rendering
Le principe est de tracer un rayon pour chaque pixel de l’image en partant de la caméra. viewPlaneUpLeft = camPos + ((vecDir*viewplaneDist)+(upVec*(viewplaneHeight/2.0f))) - (rightVec*(viewplaneWidth/2.0f)) pixViewPlan = viewPlaneUpLeft + rightVec*xIndent*x - upVec*yIndent*y Où xIndent et YIndent sont respectivement calculés de la facon qui suit : xIndent = viewplaneWidth / (float)xRes; yIndent = viewplaneHeight / (float)yRes; xRes et yRes correspondant à la résolution finale de l'image (par exemple 640x480). x et y correspondent quand à eux, à la position 2D du pixel sur l'image finale, dont on recherche la position dans l'espace sur le viewplane. On appelle donc ce calcul pour chaque pixel de l'image, qui nous retourne le vecteur directeur non normalisé du rayon. Il ne nous reste plus qu'à normaliser ce vecteur, pour obtenir un vecteur directeur unitaire, et bingo ! Nous avons désormais l'origine du rayon (la position de la caméra), le vecteur directeur de ce rayon pour chaque pixel, nous avons donc toutes les informations nécéssaires pour commencer le raytracing ! Let the fun start ! Le rendering
Les collisions Détermination des silhouettes Le but est de trouver le point P(t)=O+DIR*t Solution de l’équation des formes primitives Intersection du rayon et de l’objet Il faut trouver la solution t des polynômes de degré n (solutions analytiques) Degré 1 pour les plans Degré 2 pour les sphère et cylindres Degré 3 ou 4 pour splines et torques Les collisions
Les collisions Primitive de base : la Sphère Equation : (X-Xc)²+ (Y-Yc)²+ (Z-Zc)²= r² On substitue Ox+DIRx*t à X (idem pour Y et Z) On résoud l’équation polynomiale quadratique a*t² + b*t +c =0 obtenue, avec : a = DIRx² + DIRy² + DIRz² b = 2 * (DIRx * (Ox - Xc) + DIRy * (Oy - Yc) + DIRz * (Oz - Zc)) c = ((Ox - Xc)²+ (Oy – Yc)² + (Oz - Zc)²) – r² Calcul du déterminant det=b²-4*a*c Si det<0 pas de solution, det=0 une solution Si det>0 deux intersections telles que : t1 = (-b + sqrt(det)) / (2*a) t2 = (-b - sqrt(det)) / (2*a) Les collisions
Un peu de lumière et de couleur ! Eclairage
Eclairage for each screen pixel generate a ray from the camera to the pixel intersect the ray with all objects in the scene for the closest intersection for each light in the scene generate a ray from the intersection to the light if not obstructed: Apply illumination spawn secondary rays (e.g., reflection, refraction) combine results Eclairage
Eclairage Notion de distance Utilisation des lois de Beer Io : intensité initiale C : concentration "molaire" en produit colorant epsilon : propriété d'absorption du produit dissous l : la distance I1 = AbsorptionL *Io Eclairage
Eclairage Notion d’angle d’incidence Les produits scalaires
Couleur = Couleur(S) * scal * Couleur(L) Notion d’angle d’incidence Couleur = Couleur(S) * scal * Couleur(L) Eclairage
Textures Les matériaux Material ≠ Texture char* mName; // Le nom du material. CColor mSpecularColor; // La couleur Specular (rattaché à la brillance de l'objet). CColor mDiffuseColor; // La couleur Diffuse (éclairage diffus). CColor mAmbientColor; // La couleur Ambient (éclairage ambient). CColor mSelfIllumColor; // La couleur de Self Illum (objets éméttant eux même de la lumiére). float mShininess; // La "brillance" du material (utilisé pour la réfléxion). float mShinestrength; // La puissance de brillance (coefficient couplé avec la valeur précédente). float mTransmittivity; // Le coefficient de transmission (utilisé pour la réfraction). float mReflectivity; // Le coefficient de réfléxion (utilisé pour la réfléxion). Textures
Eclairage Détermination de la couleur d’un point Methode GetLightAt(Vector3D normal, Vector3D intersection, Material matl) retourne Couleur Calculer le vecteur LIGHTVECTOR Normaliser LIGHTVECTOR Calculer l'angle de frappe Si ANGLE <= 0 Alors COULEURFINALE = Couleur de fond Sinon COULEURFINALE = mDiffuseColor(mat) * couleur lumiére * ANGLE * I1 ; fsi Retourne COULEURFINALE Fin Methode GetLightAt. Eclairage
Réflexion
n2 / n1 = sin(ThetaT) / sin(ThetaI) Réfraction Lois de Descartes-Snell n2 / n1 = sin(ThetaT) / sin(ThetaI) n1 n2 Réfraction
Réflexion + Réfraction
Recursive Réflexion + Réfraction
Conclusion Très puissant mais coûteux en temps Des premières applications en temps réel Conclusion
Conclusion Vers le temps réel Changements algorithmiques Traitement simultané de paquets de rayons Meilleurs algorithmes pour la construction de kd- trees Nouvelles structures d’index spaciaux pour les scènes dynamiques Implémentation optimisée Utilisation des dernières technologies processeur Optimisation générale du code Développement de nouveaux matériels Massivement multi-core, multi-thread Conclusion
1 processeur quadri-coeurs Yorkfield en 45nm Année Puissance Resolution affichée FPS 2004 50 Processeurs Xeon 640x480 4 2007 1 processeur quadri-coeurs Yorkfield en 45nm 768x768 90 2 processeurs Xeon X5365 1280x720 “Doing that math, at a 1024x768 resolution for a total of 786,432 pixels times 30 rays per pixel and 60 frames per second, you get 1.415 billion rays per second required. The team at Intel estimates that within 2 years or so, the hardware will exist that will allow "game quality" ray tracing on a desktop machine. ” Conclusion
Références Développement d’un Raytracer Raytracer POV-Ray http://www.alrj.org/docs/3D/raytracer/ http://www.massal.net/article/raytrace/page1. html Raytracer POV-Ray http://www.povray.org/ Raytracer temps réel http://softwarecommunity.intel.com/articles/en g/2658.htm http://www.zgdv.de/GameDays2007/Pages/Tal ks/Slusallek.pdf Références