Vous êtes sur la page 1sur 6

Rendu projectif

Plan image
(viewport)
l
Ap A
CDP

h
d
Élimination des parties cachées
1. Projection des points sur le plan image
2. Clipping
Synthèse d’images 3. Remplissage des triangles (rasterisation) dans l’image
4. Suppression des parties cachées
©Alexandre Meyer 2002-2005 Anthony Steed 1999 5. Calcul de la couleur : illumination

1 Cours de synthèse d’images 2

Problème des parties cachées Back Face Culling


 Problème  Éliminer tous les polygones qui ne sont
pas tournés vers la caméra :

Comment n’afficher que ce qui est visible?

Cours de synthèse d’images 3 Cours de synthèse d’images 4

Back Face Culling : algorithme Back Face Culling


 Si le point de vue n’est pas devant le  Économise 50 % du temps de calcul
polygone, on n’affiche pas le polygone  En moyenne
 Produit scalaire :  Faible coût par polygone
 (Sommet-PointDeVue)*normale  Étape préliminaire pour les autres
 > 0 : on garde le polygone algorithmes
 < 0 : on l’élimine  Suffisant pour un seul objet convexe

Cours de synthèse d’images 5 Cours de synthèse d’images 6

1
Problème des parties cachées 1ere idée : algo du peintre
 Problème  Peindre les facettes polygonales dans la
mémoire vidéo suivant un ordre de
distance décroissante au point
d’observation.

Comment n’afficher que ce qui est visible?

Cours de synthèse d’images 7 Cours de synthèse d’images 8

1ere idée : algo du peintre 1ere idée : algo du peintre

Ambiguïtés  Algo
1. Trier les facettes suivant les z
décroissants dans le repère de la
caméra.
2. Résoudre les ambiguïtés dans la liste
lorsque les facettes se recouvrent.
→ découper les polygones ambigus
3. Projeter les facettes et remplir les
polygones suivant la liste.

Cours de synthèse d’images 9 Cours de synthèse d’images 10

Algo du peintre : pour ou contre 2e algo : Area Subdivision (Warnock)


 On utilise la cohérence spatiale
 Le plus intuitif des algorithmes
 On divise l’écran en zones de travail
 Problème des ambiguïtés
 Pour chaque zone, on ne considère que
les polygones qui l’intersectent
 Coût en mémoire et temps de calcul :  Si la visibilité est connue, on s’arrête
 Affichage direct à l’écran : O(p)
 Si la visibilité est inconnue, on subdivise
 Il faut trier les polygones : O(nlogn)
 On interrompt la subdivision quand on
 Efficace surtout sur des petites scènes
atteint une taille limite

Cours de synthèse d’images 11 Cours de synthèse d’images 12

2
Polygones/zone de travail Polygones/zone de travail

Inclus
Englobe Intersecte Disjoint

Cours de synthèse d’images 13 Cours de synthèse d’images 14

Quand est-ce que la visibilité est connue ? Warnock : exemple (1)

 Tous les polygones sont disjoints


 Un seul polygone intersecte ou inclus
 Un polygone englobant qui est devant les
autres

Cours de synthèse d’images 15 Cours de synthèse d’images 16

Warnock : exemple (2) Warnock : exemple (3)

Cours de synthèse d’images 17 Cours de synthèse d’images 18

3
Warnock : exemple (4) Warnock : exemple (5)

Cours de synthèse d’images 19 Cours de synthèse d’images 20

Warnock : exemple (6) 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

Cours de synthèse d’images 21 Cours de synthèse d’images 22

3e algo : Z-Buffer Z-Buffer

 Un tableau, de la taille de l’écran  Pour chaque polygone :


 stocke la valeur minimal de z pour chaque pixel  Projeter le polygone sur le plan image
 Initialisation : tous les pixels à l’infini  Pour chaque pixel (i,j) de la projection du polygone
 Calculer la valeur de z pour ce pixel
 Si z < zbuffer[i][j] alors
 Projection de tous les polygones zbuffer[i][j] = z
 On met à jour les pixels de la projection du Afficher le pixel à l’écran de la couleur du
polygone
polygone Sinon c’est que le fragment du polygone est caché donc
on ne fait RIEN

Cours de synthèse d’images 23 Cours de synthèse d’images 24

4
Z-Buffer Z-Buffer

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf 4 4 4 +inf +inf +inf +inf +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf 44 4 4 5 5 5 55 +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf 4 4 5 5 5 +inf +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf 3 3 4 4 +inf +inf +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf 3 3 3 +inf +inf +inf +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf 3 +inf +inf +inf +inf +inf +inf +inf

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf

Cours de synthèse d’images 25 Cours de synthèse d’images 26

Z-Buffer z=11>5 donc caché Exemples

+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf

+inf +inf 4 4 4 +inf +inf +inf +inf +inf +inf +inf

+inf +inf 44 4 4 5 5 5 55 +inf +inf +inf

+inf +inf +inf 4 4 5 5 5 +inf +inf +inf +inf

+inf +inf +inf 3 3 4 4 12 13 14 +inf +inf

+inf +inf +inf 3 3 3 11 12 12 13 +inf +inf

+inf +inf +inf +inf 3 +inf 10 12 12 13 +inf +inf

+inf +inf +inf +inf +inf +inf 10 10 11 12 +inf +inf

Cours de synthèse d’images 27 Cours de synthèse d’images 28

Calculer la valeur de z pour les pixels Interpoler la profondeur

 Comment calculer la valeur de Z pour chaque


Interpoler z le long de l’arête du polygone
fragment du polygones en cours de remplissage? Puis interpoler z sur la ligne de
remplissage
Depuis l’équation du plan

=> interpolation bi-linéaire
ax+by+cz+d=0 => z=(d-ax-by)/c
(X2,Y2,Z2)
 Coûteux!! Z −Z
DZY = 2 1
Il faut faire mieux … Y2 − Y1 (XL,YL,ZL) (XR,YR,ZR)
Z − ZL
DZX = R
interpolation? XR − XL
(X1,Y1,Z1)

Cours de synthèse d’images 29 Cours de synthèse d’images 30

5
Zbuffer : exemple de remplissage Contenu de la table des arêtes actives (AET)

c  Table des arêtes  Ligne y=1


7
6
(Edge Table=ET)  ac (7, 3, 1/6, 1, 3/6)
 ab (4, 3, 4/3, 1, 1/3) pas des z : de 1 en 1
5  (y2, x1, dx/dy, z1, dz/dy)
4 b  ET[1] =  y=2
3  ac (7, 3, 1/6, 1, 3/6)  ac (7, 3.166, 1/6, 1.5, 3/6)
2  ab (4, 4.333, 4/3, 1.333, 1/3) pas des z : de1.5 en 1.333
 ab (4, 3, 4/3, 1, 1/3)
1 a
0  ET[4] =  y3
0 1 2 3 4 5 6 7 8 ac (7, 3.333, 1/6, 2.0, 3/6)
 cb (7, 7, -1, 2, 2/3) 
 ab (4, 5.666, 4/3, 1.666, 1/3) pas des z : de 2 en 1.666
a=(3,1,1) b=(7,4,2) c=(4,7,4)

Cours de synthèse d’images 31 Cours de synthèse d’images 32

Z-Buffer : pour ou contre Coûts comparés


 Z-Buffer 600
Depth Sort
 Simple à implémenter Warnock
 Coûteux en mémoire (plus un pb aujourd’hui) 500 Scan Line
Z-Buffer
 Hardware 400

300
 Problème de précision
 Exemple: 200
 1 octet pour la profondeur

→ 256 niveaux de profondeur (seulement!!) 100


 Near=1.0 mètre et Far=1000 mètres
0
 4 mètres entre 2 valeurs de profondeur 100 2500 60000

Cours de synthèse d’images 33 Cours de synthèse d’images 34

OpenGL OpenGL
 Effacer le buffer et le zbuffer entre chaque image  Régler la précision du z-buffer avec NEAR et FAR
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); dans la matrice de projection
 gluPerspective(fovy, aspect, zNear, zFar)
 Active le test des Z avec le Z-buffer
glEnable(GL_DEPTH_TEST) ;  Ne jamais mettre zNear à 0
activé
→ problème de division par 0 dans la matrice générale
de projection
→ intervalle des z infini

non  En général ~ zNear=1.0 et zFar=1000.0


activé

Cours de synthèse d’images 35 Cours de synthèse d’images 36

Vous aimerez peut-être aussi