Graphique 3D et Ingenieurie de l'animation 3D Affichage NGUYEN Thi Oanh [email protected] Bộ môn Hệ thống thông tin (is.hust.edu.vn) Viện Công nghệ thông tin và truyền thông (soict.hust.edu.vn) Trường Đại học Bách khoa Hà nội Pipeline graphique (résumé) Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projection (to Screen Space) Scan Conversion (Rasterization) 3D On a déjà vu cela (cours précédent) Passage des coordonnées objets (3D) vers les coordonnées du monde (3D) Transformations (2D et) 3D - Translation Rotation Mise à l’échelle (homothétie) … Visibility / Display Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 2 Pipeline graphique (résumé) Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) 3D On verra cela au prochain cours Comment la lumière éclaire les objets (3D) ? Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 3 Pipeline graphique (résumé) Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) 3D On a déjà vu cela (cours précédent) Passage des coordonnées du monde (3D) vers les coordonnées de la caméra (3D !) - Projection orthographique ou parallèle Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 4 Pipeline graphique (résumé) Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) 3D On va voir cela aujourd’hui Les portions en dehors du volume de vue (frustum) sont coupées Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 5 Pipeline graphique (résumé) Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping 2D On a déjà vu cela (cours précédent) Passage des coordonnées caméra 3D vers les coordonnées caméra 2D - Etape qui se confond avec l’étape 2 – transformation de visualisation Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 6 Pipeline graphique (résumé) Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) 2D On va voir cela aujourd’hui Passage en pixels Affichage à l’écran Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 7 Rendu polygonal 8 Représentation des objets 3D Comment représenter des objets 3D en mémoire pour ensuite les afficher sur l'écran ? - Affichage d'objets 3D complexes - Besoin d'une méthode rapide • surtout pour l'animation temps réel Problèmes : - On veut conserver la notion d'orientation des surfaces • Pour l'éclairage, la texture, … Solution : - Découpage des surfaces 3D en polygones (triangles) • Exemples de polygones (composés de points et de lignes droites - pas de courbes) : 9 Découpage en polygones Tous les objets, même complexes, se découpent en polygones 10 Erreur d'approximation polygonale Une erreur existe pour l'approximation d'une surface courbe Cependant, afficher (3D) une surface plane est beaucoup plus rapide qu'afficher une surface courbe - Rendu (i.e. calcul de l'apparence) plus rapide - Calcul d'ombre, d'éclairage et de texture beaucoup plus rapide 11 Rendu graphique des polygones Chaque polygone possède une orientation qui permet de calculer son éclairage / ombrage, texture, … - Un calcul par polygone plutôt qu'un calcul par point (plus rapide) 12 Polygone le plus facile : triangle Souvent (pas toujours), on divise une surface en triangles - Plus petit polygone (3 points ou 3 droites) - Toujours convexe : simplifie le découpage - On peut diviser toutes les surfaces en triangles sans difficulté 13 Projection 3D des triangles On projette facilement chaque triangle 3D sur l'écran 2D On conserve l'information sur - Les points (3D) des extrémités OU les côtés (arêtes) - L'orientation du triangle en 3D (vecteur normal) 14 Vecteur normal d'une surface (rappel 1) Le vecteur normal d'une surface est perpendiculaire à la surface Il est représenté sous la forme d'un vecteur 3D [Nx, Ny, Nz]T C'est le calcul du vecteur normal qui est lent dans l'affichage, d'où le découpage d'une surface courbe en polygones plats (un seul vecteur normal à calculer) Ce vecteur normal est utilisé dans beaucoup de calculs d'apparence du polygone (couleur, luminosité, ombre, texture) 15 Vecteur normal d'une surface (rappel 2) Pour calculer le vecteur normal, on a besoin de 3 points (X,Y,Z) sur la surface (P1, P2, P3) On calcule 2 vecteurs parallèle à la surface (voir page précédente) - E1 = P3 - P2 E2 = P2 - P1 • E1X = P3X - P2X • E1Y = P3Y - P2Y • E1Z = P3Z - P2Z Le vecteur normal est le produit vectoriel entre les 2 vecteurs - N = E1 x E2 • NX = E1YE2Z - E1ZE2Y Attention à l'ordre des termes et aux signes ! Produit non-commutatif ! • NY = E1ZE2X - E1XE2Z • NZ = E1XE2Y - E1YE2X 16 Vecteur normal d'une surface (rappel 3) Représentation matricielle du produit vectoriel (en anglais cross product) : ou encore (équivalent) Note : le produit vectoriel se note par ^ ou par x selon les auteurs. 17 Produit vectoriel Le résultat d'un produit vectoriel est toujours orthogonal aux deux vecteurs de base Le produit vectoriel est non-commutatif. En cas d'inversion des termes, le produit sera l'inverse Exemple avec les axes cartésiens : - Soit les vecteurs du système d'axes cartésiens définit comme suit : - X (1,0,0), Y (0,1,0) et Z (0,0,1) • X x Y = Z, mais Y x X = - Z • Y x Z = X, mais Z x Y = - X • Z x X = Y, mais X x Z = - Y 18 Nombre de polygones nécessaires Pour un objet complexe, il n'est pas rare d'avoir un nombre de polygones supérieur à 105 (100 000) et même beaucoup plus : - Plus de polygones = meilleur rendu (image plus réaliste) - Plus de polygones = temps de calcul élevé - Différentes techniques existent pour améliorer chaque polygone 19 Exemples de modèles polygonaux 700,000 82 millions 13 millions 372,422,615 Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 20 Niveaux de détails et polygones Plus on est loin d’un objet, moins on voit de détails Gain de géométrie 69,451 polys 2,502 polys 251 polys Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 76 polys 21 Simplification selon le niveau de détails Calculer des niveaux de détail pour chaque objet de la scène : pré-calcul Lors du déplacement dans la scène choisir à chaque instant le bon niveau de détail et l’afficher 19.000 faces 1.000 faces 100 faces 40 faces Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 22 Affichage des polygones Plusieurs algorithmes existent - pour transformer une surface en polygones - pour afficher rapidement des polygones Le découpage polygonal est très utilisé pour l'animation en temps réel (par exemple, les jeux) - Pour les images statiques ou l'animation pré-calculée (non temps réel), nous verrons d'autres méthodes (prochains cours) Plusieurs algorithmes sur les polygones sont déjà implémentés dans les cartes graphiques et autre matériel spécialisé 23 Objets visibles dans le champ de vision (clipping) 24 Parties visibles des objets Modeling Transformations Illumination (Shading) Enlever les objets en dehors du volume de vue (frustum) Viewing Transformation (Perspective / Orthographic) Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Source : Hector Briceno, Synthèse d'images, Université de Lyon 1 (France) 25 Objets visibles dans le champ de vision View frustum culling : élimination des objets hors du cone de vue - Effectué par l’application (ou la librairie, ex performer) Calcul naïf : pour chaque primitive, calculer si elle est dans le champ de vision - un test par polygone !!! Bounding box : on entoure chaque objet (composé de nombreux polygones) d’une boîte englobante. Si la boite est hors du volume de vue, alors son contenu peut être éliminé. Accélération : hiérarchie de boites englobantes. Si une boite est hors du volume de vue alors toutes ses filles aussi. - Problème de la construction de la hiérarchie Source : Hector Briceno, Synthèse d'images, Université de Lyon 1 (France) 26 Découpage des bords Problème : ne dessiner que la partie visible sur l'image - Efficacité - Temps d'exécution Aussi appelé clipping ou clippage selon les textes 27 Algorithme de Cohen-Sutherland Découpage en 9 zones codées chacunes sur 4 bits T B 1001 1000 1010 0001 0000 0010 0101 0100 0110 Ecran L T: B: R: L: signe( y max y ) signe( y y min ) signe( x max x ) signe( x x min ) R Code : TopBottomRightLeft - avec 0=intérieur 1=extérieur - On compare les codes des extrémités du segment (ET logique) Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 28 Algorithme de Cohen-Sutherland T B 1001 1000 1010 0001 0000 0010 0101 0100 0110 L R Si T 1 B 1 R 1 L1 =0000 et T 2 B 2 R2 L 2 =0000 ⇒ Le segment est à l'intérieur ⇒ Acceptation triviale Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 29 Algorithme de Cohen-Sutherland T B 1001 1000 1010 0001 0000 0010 0101 0100 0110 L R Si T 1 B 1 R1 L 1 & T 2 B 2 R 2 L 2 ≠0000 ⇒ Le segment est à l'extérieur⇒ Rejet trivial E x : T 1 B1 R 1 L 1 =1001& T 2 B 2 R 2 L 2 =1010 =1000 ≠0000 Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 30 Algorithme de Cohen-Sutherland T B 1001 1000 1010 0001 0000 0010 0101 0100 0110 L R Moins trivial : il va falloir diviser le segment en deux et tester chaque segment récursivement Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 31 Algorithme de Cohen-Sutherland Si les deux sommets sont à l’intérieur Acceptation triviale Si les deux sommets respectent la condition : x1, 2 xmin ou x1, 2 xmax ou y1, 2 ymin ou y1, 2 ymax Rejet trivial Sinon, divise en deux segments avec la ligne de support d’un côté de la fenêtre et teste chaque segment récursivement Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 32 Algorithme de Cohen-Sutherland Cas non trivial : Résultat donne T,B,R et/ou L = 1 - Intersecte le segment avec le côté de ce bit - Rejette la partie extérieure du segment - Remplace ce sommet par l’intersection - Re-teste récursivement avec le segment tronqué Remarques : - Extension facile en 3D (boîte) - Algorithme de clippage de segments le plus utilisé - Efficace en assembleur, surtout si beaucoup de cas triviaux Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 33 Calcul des points d'intersections T B 1001 1000 1010 0001 0000 0010 0101 0100 0110 L R Rappel: y = mx+b ou x = (y-b)/m avec b=y1-mx1 et m=y2-y1/x2-x1 Si T=1 Si B=1 Si R=1 Si L=1 x x1 Ymax y1 m y Ymax x x1 Ymin y1 m y Ymin y y1 m X max x1 x X max y y1 m X min x1 x X min Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 34 Calcul des points d'intersections Méthode dichotomique On coupe la ligne en deux parties égales et on vérifie laquelle des deux moitiés est encore à cheval sur la frontière de la fenêtre On continue à découper les moitiés qui se retrouvent à cheval sur la frontière jusqu'à ce que l'on ait coupé au bon endroit Méthode surtout implantée au niveau matériel. Les divisions par deux sont effectuées à l'aide d'un décalage des bits vers la droite (par ex: 100 => 10 ie 4 => 2) Pour un écran 1024*1024, on a au maximum 10 subdivisions (210 = 1024) Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 35 Exemple de segments candidats Ymax 0001 0010 Ymi n Cas maintenant triviaux 0100 Xmi n Xmax T 1 B 1 R 1 L1 &T 2 B 2 R2 L 2 =0000 Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 36 Découpage de polygone Si on utilise un découpage de segment pour chaque coté du polygone : Mais si on utilise un algorithme de remplissage du polygone après découpage il nous faut joindre les intersections ? Source : Caroline Rougier, IFT2730 - Traitement d'images, Université de Montréal (Canada). 37 Conversion en pixels et tracé des primitives 2D (rasterization) 38 Conversion en pixels discrets Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Découper chaque primitive (espace continu) en pixel (espace discret) Affichage rapide et efficace des primitives - Opérations faites des millions de fois - Privilégie les calculs en nombres entiers - Très souvent implémentés en hardware Interpoler les valeurs connues aux sommets : couleur, profondeur, … Visibility / Display 39 Primitives 2D Dans tous les cas il faut savoir afficher du 2D, ligne ou polygone - il faut savoir quels pixels allumer pour un objet mathématique - il faut savoir remplir un polygone Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 40 Tracé de droites Quels pixels faut-il allumer pour tracer une droite ? 41 Comment tracer une droite ? Une droite est représentée par : - deux points (x1,y1) et (x2,y2) qu'on suppose à l'intérieur de l'image - une équation y = mx + b (1 multiplication + 1 addition par point) Méthodes brutes (naïve) - Discrétisation de la primitive en n points - Approximation au pixel le plus proche pour chacun des n points Peu efficace et peu précis Méthodes incrémentales - La position du point suivant est choisi de façon à minimiser l’erreur d’approximation. Méthode optimale pour le tracé de segments de droites Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 42 Algorithme de Bresenham (1965) (1) Algorithme simple, efficace et incrémental L'idée est de mesurer l'erreur à chaque itération (distance du pixel à la droite) et de choisir la meilleure approximation Soit une pente < 45 ° (m < 1). Pour chaque valeur de x, l'algorithme choisit entre le pixel à droite (dit "E"), ou le pixel en haut à droite (dit "NE") 43 Algorithme de Bresenham (1965) (2) Premier octant : - Une droite est définie par : y = mx +b On cherche le prochain pixel comme celui qui minimise l’erreur - e = (d2 – d1) / 2 Au premier point (x0+1, y0+m) - e1 = (d2 - d1) / 2 = - 0.5 Ensuite l’erreur se propage : - NE : e = e + m - 1 - E:e=e+m Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 44 Algorithme de Bresenham (1965) (3) void Bresenham (x0, y0, x1, y1) { double m = y1 - y0 / x1 - x0 ; double e = -0.5; int y = y0; // pente de la droite // erreur incrémentale // ligne initiale for(int x = x0; x <= x1 ; x++) { // on parcours le long des x AfficherPixel (x, y); // on allume le pixel (x,y) e=e +m; if (e >= 0) { y = y + 1; e = e - 1; } // erreur pour le pixel suivant // si l’erreur est trop élevée // on change de ligne // et on réajuste l’erreur de cette nouvelle ligne } } 45 Algorithme de Bresenham (1965) (4) On généralise ensuite aux huit octants : 46 Tracé de primitives simples Mitchener a proposé un algorithme efficace pour tracer des cercles Il existe ainsi plusieurs algorithmes adaptés au tracé de figures géométriques simples (ellipse par exemple) On retrouve facilement sur Internet des fonctions déjà écrites ou des librairies contenant ces fonctions 47 Remplissage de polygone (Scan line) 1. Remplissage par recherche des points d'intersection d'une ligne horizontale avec des contours (un nombre pair). 2. Une fois les points d'intersection obtenus, remplissage selon une règle de parité : incrémentation de la parité à chaque traversée de frontière et tracé si impair. 3. Gestion des conflits frontaliers : on prend les points intérieurs au polygone pour éviter les chevauchements. Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 48 Est-ce qu'un point est à l'intérieur ? Comment savoir si un point est à l'intérieur ou non d'un polygone ? 49 Test de la parité On trace une ligne droite vers l'extérieur et on compte le nombre d'intersections avec le polygone. - Nombre impair d'intersections : intérieur - Nombre pair d'intersections : extérieur 5 intersections : intérieur 4 intersections : extérieur * Attention aux intersections avec les sommets ou au parcours le long d'une arête. 50 Test de la parité : attention Attention - aux intersections avec les sommets - au parcours le long d'une arête. Différentes astuces permettent d'éviter ces problèmes - selon les cas et les besoins ? ??? 51 Remplissage de polygone (récursif) void RemplirPolygone (int x, int y) { if ((x<0) || (x>=sizex)) return; if ((y<0) || (y>=sizey)) return; } if (!Frontiere(x,y) && (Rempli(x,y)) { Remplir (x,y); RemplirPolygone (x-1,y); RemplirPolygone (x+1,y); RemplirPolygone (x,y-1); RemplirPolygone (x,y+1); } Initialisation à partir d'un point que l'on sait à l'intérieur 52 Attention à la connexité ! Pour le remplissage, comme pour les autres algos : - Un contour est en connexité 8 (un pixel à 8 voisins) - Une région est en connexité 4 (un pixel à 4 voisins) On peut choisir l'inverse, mais c'est moins pratique Région : 4-connexes Contour : 8-connexes Région : 8-connexes, Contour : 4-connexes 53 Calcul de visibilité pour l’affichage Elimination des parties cachées 54 Visibilité pour l’affichage Modeling Transformations Illumination (Shading) Elimination des parties cachés Viewing Transformation (Perspective / Orthographic) Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display 55 Rôle des lignes cachées Les lignes cachées dans l'image servent à donner l'illusion 3D Elles permettent de voir les objets devant ou derrière 56 Elimination des parties cachées Espace image contre espace objet Algorithmes « objet » - Backface culling - Algorithme du peintre (tri par la profondeur) - BSP-trees Algorithmes « image » - Warnock - Z-buffer - Balayage de lignes (Scan line) 57 Elimination des parties cachées (objet) Eliminer tous les polygones qui ne sont pas tournés vers la caméra 58 Elimination des parties cachées (objet) Test de visibilité (backface culling) - Pour chaque polygone, effectuer le produit scalaire entre le vecteur normal au polygone et le vecteur de projection à l'écran • Produit scalaire > 0 : polygone non-visible (caché) • Produit scalaire < 0 : polygone visible (affiché) 59 Produit scalaire entre 2 vecteurs (rappel) Le produit scalaire (dot product) entre 2 vecteurs V1 et V2 : - Produit Scalaire = V1XV2X + V1YV2Y + V1ZV2Z - Note : • Le résultat du produit scalaire est un nombre • Le résultat du produit vectoriel est un vecteur 60 Test de visibilité (backface culling) Economise 50 % du temps de calcul - En moyenne Faible coût par polygone Etape préliminaire pour les autres algorithmes Suffisant pour un seul objet convexe Doit être fait en 3D - Calcul avec le vecteur normal de chaque polygone 61 Elimination des parties cachées Une scène = un ensemble de primitives : En général un ensemble de polygones (triangles) Détermination des surfaces visibles : équivalent au tri => O(n log Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) n) 62 Algorithme du peintre Analogie avec un peintre qui va peindre d'abord le ciel, puis les nuages et puis les oiseaux Affichage des objets en partant du plus lointain et en allant vers le plus proche Autre nom : Tri par la profondeur (Depth-sort searching) 63 Algorithme du peintre : algorithme Algorithme : - Trier les objets par profondeur - Affichage des objets en partant du plus lointain et en allant vers le plus proche Un polygone a une profondeur minimum et une profondeur maximum - Tri selon profondeur maximum - Comparaison des polygones sur l'intervalle (minimummaximum) - Problème si chevauchement des profondeurs 64 Algorithme du peintre : différents cas A) Polygones disjoints en X,Y : aucun problème Aucun problème B) Un polygone est inclus dans l'autre • comparer les profondeurs Z Aucun problème C) Les deux polygones s'intersectent partiellement • faire plus de tests sur Z Possibilités de problèmes ! 65 Algorithme du peintre : problèmes Problèmes : - Objets sur plusieurs profondeurs - Objets entrelacés Solution : - découpage en polygones plus petits Algorithme : - Si 2 polygones avec profondeurs entrelacées (min Z et max Z) • Si les deux polygones se superposent (en X,Y) - Alors découper en plusieurs polygones plus petits 66 Peintre : pour ou contre Pour ou contre ? • Le plus intuitif des algorithmes • Coût en mémoire : – Affichage direct à l’écran : O(p) – Il faut trier les polygones : O(nlogn) • Temps de calcul : – On affiche toute la scène – Efficace surtout sur des petites scènes Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 67 Subdivision de l'espace en quadrants Algorithme de Warnock Subdiviser l'image en quatre zones carrées Si aucun polygone dans une zone - Remplir la zone avec la couleur du fond Si un seul polygone dans la zone - Remplir avec la couleur du fond - Dessiner le polygone Si plusieurs polygones dans la zone - Subdiviser la zone en quatre zones carrées 68 Warnock : exemple (1) 69 Warnock : exemple (2) 70 Warnock : exemple (3) 71 Warnock : exemple (4) 72 Warnock : exemple (5) 73 Warnock : exemple (6) 74 Warnock : pour ou contre Utilise la cohérence spatiale Plus efficace avec des grands polygones Coût mémoire parfois élevé Implémentation facile : appels récursifs à la même fonction Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 75 Z-Buffer Un tableau, de la taille de l’écran On stocke la valeur maximale de z pour chaque pixel - z est la direction de visée, exprime la distance à l’oeil Initialisation : tous les pixels à moins l’infini Projection de tous les polygones - On met à jour les pixels de la projection du polygone Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 76 Z-buffer : algorithme Pour chaque polygone : - Projeter le polygone sur le plan image - Pour chaque pixel dans la projection du polygone • Calculer la valeur de z pour ce pixel • Si z est supérieur à la valeur courante de z max - Changer z maximal - Afficher le pixel à l’écran, de la couleur du polygone Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 77 Z-buffer (1) -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 78 Z-buffer (2) -∞ -∞ 1 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ 1 1 1 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ 2 2 3 2 2 2 2 3 3 -∞ 3 3 -∞ -∞ -∞ -∞ -∞ 2 2 -∞ -∞ -∞ -∞ 2 2 2 -∞ -∞ -∞ 3 3 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 79 Z-buffer (3) -∞ -∞ -∞ -∞ -∞ 1 -∞ -∞ -∞ -∞ 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 -∞ -∞ -∞ -∞ -∞ -∞ -∞ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 80 Z-Buffer : pour ou contre Pour : - Facile à implémenter, scan-line - Travaille dans l’espace image • Rapide Contre : - Coût en mémoire - Travaille dans l’espace image • aliasing • artefacts Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 81 Balayage de lignes (Scan Line) Le z-buffer doit visiter chaque pixel couvert par un objet, même s’il est caché Le balayage de lignes utilise la cohérence le long d’une ligne (scanline) pour ne calculer la visibilité qu’entre les polygones Extension du remplissage de polygone par balayage afin de traiter plusieurs polygones à la fois. La profondeur n’est calculée seulement que lorsque plus d’un polygones s’entrecoupent. 82 Coûts comparés Temps Depth Sort Peintre 600 Warnock Scan Line Z-Buffer 500 400 300 200 100 0 100 2500 60000 Nombre de polygones Source : Antoine Bouthors, Synthèse d'images, ENSIMAG (Grenoble, France) 83 Choix de l’algorithme L’algorithme idéal dépend : - De la complexité de la scène - Du matériel disponible - De ce qu’on veut faire en plus de l’affichage Z-Buffer en général : - Fourni gratuitement dans la librairie graphique - Pas de pré-traitement - Quelques effets de bord si on le connaît mal Le balayage de lignes (scan line) pour les hackers : - Quand on ne peut pas utiliser la carte graphique - Faible coût mémoire - Lié à la fonction d’affichage, peut être très efficace Source : Hector Briceno, Synthèse d'images, Université de Lyon 1 (France) 84 Modification pour effet de transparence Au lieu de ne garder que le pixel le plus proche, on conserve tout Chaque objet à un indice de transparence • (0 <= indice <= 1) 0 : transparent 1 : opaque Pour connaître la couleur d'un pixel, on fait une sommation pondérée Requiert beaucoup plus de mémoire (plusieurs données par pixel) 85