Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec...

60
Chapitre 2 : OpenGL 3D Elimination parties cachées - Projection - Eclairement Modélisation 3D et Synthèse Fabrice Aubert [email protected] Master Informatique 2015-2016 F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 1 / 60

Transcript of Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec...

Page 1: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Chapitre 2 : OpenGL 3DElimination parties cachées - Projection - Eclairement

Modélisation 3D et Synthèse

Fabrice [email protected]

Master Informatique

2015-2016

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 1 / 60

Page 2: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Objectifs

I Briques élémentaires pour la visualisation 3D :

• Elimination des parties cachées (Depth Buffer).• Coordonnées homogènes d’un point.• Systèmes de coordonnées Eye Coordinates, Clip Coordinates, NDC,

Window Coordinates.• Définition d’un volume de visualisation (projection orthogonale et perspective)• Correction de perspective.• Eclairage (modèle de Phong)

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 2 / 60

Page 3: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

1 Elimination parties cachées

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 3 / 60

Page 4: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Fragment

I Toutes les valeurs d’un pixel (composantes rouge, vert, bleu, alpha, ...) sont regroupéessous le nom de fragment.

I Les fragments de chaque pixel sont mémorisés dans un ou plusieurs buffers : par exemple,la couleur (4 composantes) de chacun des pixels est mémorisée dans le COLOR BUFFER.

I Pour un pixel, le fragment mémorisé est appelé fragment destination (i.e. les valeurscourantes du pixel).

I Le fragment obtenu après le fragment shader est appélé fragment source (i.e. celui quiest en train d’être tracé).

I Remarque : le COLOR BUFFER est initialisé par glClear(GL_COLOR_BUFFER_BIT); avecles couleurs spécifiées par glClearColor(r,v,b,a).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 4 / 60

Page 5: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Mise à jour des fragments : exemple

_pos i t ionData ={−0.8 ,0.0 ,−0.3 , / / ve r tex 0 / / f i r s t t r i a n g l e0.3 ,−0.7 ,−0.3 , / / ve r tex 10.0 ,0.9 ,−0.3 , / / ve r tex 2

−0.2 ,−0.5 ,0.4 , / / ve r tex 3 / / second t r i a n g l e0 .3 ,0 .4 ,0 .4 , / / ve r tex 40.2 ,−0.9 ,0.4 / / ve r tex 5

} ;_colorData ={

1 ,0 ,0 ,1 , / / co l o r red / / f i r s t t r i a n g l e1 ,0 ,0 ,1 ,1 ,0 ,0 ,1 ,

0 ,0 ,1 ,1 , / / co l o r blue / / second t r i a n g l e0 ,0 ,1 ,1 ,0 ,0 ,1 ,1 ,

} ;

I Chaque fragment tracé subit (après l’exécution du fragment shader) :

co lo r ( d e s t i n a t i o n ) <−− co lo r ( source )

I ⇒ la couleur du pixel tracé remplace la précédente

I Conséquence : a la fin, c’est le dernier pixel tracé qui est affiché.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 5 / 60

Page 6: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Depth BufferI En chaque pixel est mémorisée la valeur de profondeur (la coordonnée z en Window Coordinate qui est comprise

entre 0 et 1 : cf cours précédent) dans le DEPTH BUFFER.I Remarque : l’ensemble des buffers qui mémorisent l’ensemble des données des pixels est appelé FRAME BUFFER

(regroupe le COLOR BUFFER, DEPTH BUFFER, et... d’autres possibles).I On peut activer un test et une mise à jour sur ces valeurs de profondeur.

void GLAppl icat ion : : i n i t i a l i z e ( ) {g lC lea rCo lo r ( 1 , 1 , 1 , 1 ) ;g lClearDepth ( 1 . 0 ) ;

g lEnable (GL_DEPTH_TEST ) ; / / enables depth opera t ions

glDepthFunc (GL_LESS ) ; / / t e s t = depth ( src ) < depth ( ds t )glDepthMask (GL_TRUE ) ; / / enables f o r w r i t i n g

. . .}

void GLAppl icat ion : : draw ( ) {g lC lea r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;. . .

}

I Chaque fragment tracé subit (après l’exécution du fragment shader) :

Si depth ( src ) < depth ( ds t ) A lo rsdepth ( ds t ) <−− depth ( src )co l o r ( ds t ) <−− co lo r ( s rc )

Fin Si

I ⇒ la couleur du pixel tracé remplace la couleur précédente uniquement s’il a une profondeur inférieure.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 6 / 60

Page 7: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Elimination des parties cachées

I Cet "algorithme" simple permet d’obtenir l’élimination des parties cachées (algorithme dudepth buffer ou du Z-buffer).

I Autre exemple :

_pos i t ionData ={−0.8 ,0.0 ,−0.3 , / / V0 / / f i r s t t r i a n g l e0.3 ,−0.7 ,0.8 , / / V10.0 ,0.9 ,−0.3 , / / V2

−0.2 ,−0.5 ,0.4 , / / V3 / / second t r i a n g l e0 .3 ,0 .4 ,0 .4 , / / V40.2 ,−0.9 ,0.4 / / V5

} ;

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 7 / 60

Page 8: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Calcul de la profondeur

I La profondeur de chaque fragment source est obtenue :

• par l’interpolation linéaire de gl_Position.z du vertex shader (à préciser :correction de perspective vue plus loin). Pour rappel :

# vers ion 130

i n vec3 p o s i t i o n ; / / a t t r i b u t ( x , y , z )

void main ( ) {g l _ P o s i t i o n =vec4 ( pos i t i on , 1 . 0 ) ; / / ( x , y , z ,w=1.0)

}

• puis en reportant cette valeur interpolée sur [0,1] (Window Coordinates).

I C’est la valeur de profondeur en Window Coordinates qui est mémorisée/testée.

I Remarque : la profondeur est disponible (en lecture seule) dans le fragment shader par lavariable prédéfinie gl_FragCoord.z (donc comprise entre 0 et 1).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 8 / 60

Page 9: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

2 Coordonnées homogènes

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 9 / 60

Page 10: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Représentation d’un point 3D par 4 coordonnées

I Représenter un point 3D (x ,y ,z) en coordonnées homogène consiste à ajouter une 4ième coordonnée w (différentede 0).

I Passer des coordonnées 3D en coordonnées homogènes :

P3D =

xyz

⇐⇒ PH =

xwywzww

avec w ∈ R∗(w 6= 0)

I Au plus simple : prendre w = 1.0 (point homogène dit normalisé).I Passer des coordonnées homogènes en coordonnées 3D :

PH =

xyzw

⇐⇒ P3D =

x/wy/wz/w

I Intérêt ? ? Toute transformation affine (translation, rotation, changements d’échelle, projections, composition de ces

transformations, ...) se traduiront avec une unique matrice 4×4 (sera détaillé dans le chapitre "transformations etchangements de repères").

I Un même point 3D a donc une infinité de représentation en homogènes (ex : (2,3,4,1) ; (4,6,8,2) ; (3,4.5,6,1.5) sontdes représentations du même point 3D (2,3,4) ).

I Remarque : on différencie les points (qui ont une coordonnée w 6= 0) et les directions (en posant w = 0 et lescoordonnées (x ,y ,z) restent identiques). Ex : (3,4,2,0) représente le vecteur 3D (3,4,2).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 10 / 60

Page 11: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Coordonnées homogènes et vertex shader

# vers ion 130

i n vec3 p o s i t i o n ; / / a t t r i b u t ( x , y , z )

void main ( ) {g l _ P o s i t i o n =vec4(10.0∗ pos i t i on , 1 0 . 0 ) ; / / même po in t que vec4 ( pos i t i on , 1 . 0 )

}

I les coordonnées de gl_Position sont appelées clip coordinates (car clipping des triangles effectué avec cescoordonnées homogènes).

I les coordonnées de gl_Position.xyz/gl_Position.w sont appelées Normalized Device Coordinates ou NDCI Rappel : "Normalized" car seuls les points de coordonnées 3D (x ,y ,z) ∈ [−1,1] sont visibles.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 11 / 60

Page 12: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Exemple calcul en coordonnées homogènes : translation

I On souhaite déplacer les points par une translation de vecteur T =

TxTyTz

.

��

��

x ′ = x +Txy ′ = y +Tyz′ = z +Tz

P′ = P +T

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 12 / 60

Page 13: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Translation en coordonnées homogènes

I On peut traduire cette translation avec les coordonnées homogènes de la façon suivante :x ′

y ′

z′

w ′

=

1 0 0 tx0 1 0 ty0 0 1 tz0 0 0 1

xyzw

(produit de matrice)

C’est à dire :P′ = TP

avec

T =

1 0 0 tx0 1 0 ty0 0 1 tz0 0 0 1

I La matrice 4x4 T est appelée matrice homogène (translation ici).

I Exercice : vérifier qu’on obtient bien la translation "usuelle" P′ = P +T

I Exercice : l’appliquer à une direction u =−→AB.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 13 / 60

Page 14: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Exemple OpenGL

_pos i t ionData ={−0.8 ,0.0 ,−0.9 , / / ve r tex 0 / / f i r s t t r i a n g l e ( red )0.3 ,−0.7 ,0.8 , / / ve r tex 10.0 ,0.9 ,−0.3 , / / ve r tex 2

−0.2 ,−0.5 ,0.4 , / / ve r tex 3 / / second t r i a n g l e ( blue )0 .3 ,0 .4 ,0 .4 , / / ve r tex 40.2 ,−0.9 ,−0.4 / / ve r tex 5

} ;

Translation de vecteur (0.6,−0.4,−0.2)(pour l’ensemble des sommets)

I ⇒ passer une matrice de transformation homogène au vertex shader.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 14 / 60

Page 15: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Matrice et shader

I La matrice définie dans l’application cliente(attention : column-major order !)

s td : : vector < f loa t > _matr ix ;. . ._matr ix ={

1 . 0 ,0 .0 ,0 .0 ,0 .0 ,0 . 0 ,1 .0 ,0 .0 ,0 .0 ,0 . 0 ,0 .0 ,1 .0 ,0 .0 ,0.6 ,−0.4 ,−0.2 ,1.0

} ;. . .

I le vertex shader :

# vers ion 130

i n vec3 p o s i t i o n ; / / a t t r i b u t ( x , y , z )i n vec4 co lo r ; / / a t t r i b u t ( r , v , b , a )

out vec4 fCo lo r ;

un i form mat4 mat r i x ; / / no ter l e type

void main ( ) {fCo lo r = co lo r ;g l _ P o s i t i o n =mat r i x∗vec4 ( pos i t i on , 1 . 0 ) ;/ / no ter les opé r a t i o n s poss ib les en g l s l :/ / p r o d u i t ∗ sur les mat4

}

I le tracé (passer la matrice au vertex shader) :

g lC lea r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;

glUseProgram ( _program ) ;g lB indVer texAr ray ( _vao ) ;

i n t l o c a t i o n M a t r i x =glGetUni formLocat ion ( _program , " mat r i x " ) ;/ / paramè t r e s du glUni form un peu d i f f é ren t :g lUn i fo rmMat r i x4 fv ( l o ca t i on Ma t r i x , 1 ,GL_FALSE , ( const GLf loa t∗)_mat r ix . data ( ) ) ;glDrawArrays (GL_TRIANGLES, 0 , 6 ) ;

glUseProgram ( 0 ) ;g lB indVer texAr ray ( 0 ) ;

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 15 / 60

Page 16: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Remarques

I Cette approche sera généralisée pour toute transformation dans le prochain chapitre(représentation par une matrice).

I Remarquer que les données (les sommets) de l’application n’ont pas été modifiées.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 16 / 60

Page 17: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

3 Projection orthogonale

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 17 / 60

Page 18: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Objectif

I Revient à "ignorer" le z sur le schéma. Mais il faut conserver la profondeur pour l’élimination des parties cachées !I Donc rien à faire... (projection orthogonale déjà obtenue par gl_Position=vec4(position,1.0)).I ... cependant on introduit un volume de visualisation un peu plus souple et intuitive que les coordonnées normalisées

en introduisant la notion de caméra (= observateur = Eye).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 18 / 60

Page 19: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Volume de visualisation

I On veut :

• un repère Eye direct (avec, intuitivement, X vers la droite, Y vers le haut, et, donc, ladirection du Z "vers l’arrière").

• un volume de visualisation défini par rapport à Eye avec des coordonnéesquelconques (paramètres near,far,left,right et top).

• Attention : near et far sont des "distances" "devant" Eye (et non des coordonnées z).Autrement dit, l’écran est en z=-near.

I ⇒ on définira les points à tracer dans le repère Eye (plutôt qu’en Normalized DeviceCoordinates)

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 19 / 60

Page 20: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Calcul projection orthogonale

I On se donne (left,right,bottom,top,near,far).

I Les sommets P sont donnés en Eye Coordinates : PEye.

I Si on donne PEye au vertex shader, on doit le convertir en Clip Coordinates PCC (i.e. pouraffecter gl_Position=(xCC ,yCC ,zCC ,wCC)).

I Commençons par calculer PEye en coordonnées normalisées PNDC

I Exemple pour coordonnée x : il suffit de reporter xEye ∈ [left, right] sur xNDC ∈ [−1,1](interpolation linéaire)

I Exercice : dans le cas général quel est le calcul pour reporter une valeur t de [a,b] sur[c,d] (linéairement) ?

xNDC = (xEye− leftright− left

)(1− (−1))+(−1)

⇒ xNDC = xEye2

right− left− right + left

right− left

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 20 / 60

Page 21: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Matrice de projection orthogonale

I Idem pour les 3 coordonnées (attention au changement de signe pour z : near et far sontdes "distances").

xNDC = xEye2

right−left −right+leftright−left

yNDC = yEye2

top−bottom −top+bottomtop−bottom

zNDC = zEye−2

far−near −far+nearfar−near

I Traduction en coordonnées homogènes ? (CC = Clip Coordinates)

xCCyCCzCCwCC

=

2

right−left 0 0 − right+leftright−left

0 2top−bottom 0 − top+bottom

top−bottom0 0 −2

far−near − far+nearfar−near

0 0 0 1

xEyeyEyezEye

wEye = 1.0

PCC = Projection×PEye

I Exercice : vérifier en effectuant le produit de matrice puis en divisant par la 4iemecoordonnée.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 21 / 60

Page 22: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Shaders

I Les positions des sommets sont donnés au vertex shader dans le repère de la caméra(repère Eye).

I La variable gl_Position doit être en Clip Coordinates : faire le calcul précédent.

# vers ion 130

i n vec3 p o s i t i o n ; / / a t t r i b u t ( x , y , z )/ / supposé en Eye Coordinates

i n vec4 co lo r ; / / a t t r i b u t ( r , v , b , a )

out vec4 fCo lo r ; / / out pour ver tex , i n pour fragment

uni form mat4 p r o j e c t i o n ;

void main ( ) {fCo lo r = co lo r ;g l _ P o s i t i o n = p r o j e c t i o n∗vec4 ( pos i t i on , 1 . 0 ) ;

}

Application C++ :

i n t l o c a t i o n P r o j e c t i o n =glGetUni formLocat ion ( _program , " p r o j e c t i o n " ) ;g lUn i fo rmMat r i x4 fv ( l o c a t i o n P r o j e c t i o n ,1 ,GL_FALSE, _ p r o j e c t i o n . f v ( ) ) ;

/ / où _ p r o j e c t i o n est de classe Matr ix4 ( c f t ransparen t su ivan t )

glDraw . . . ( . . . ) ;

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 22 / 60

Page 23: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Classe Matrix4

I Classe Matrix4 pour gérer/calculer les matrices homogènes dans l’application C++ :

class Matr ix4 {private :

double _m[ 1 6 ] ; / / / < c o e f f i c i e n t s ( major−column order ). . .

public :/ / / r e tu rns an or thogonal p r o j e c t i o n mat r i xs t a t i c Matr ix4 fromOrtho ( double l e f t , double r i g h t , double bottom , double top , double znear , double z f a r ) ;

/ / / r e tu rns a p o i n t e r to f l o a t values o f the mat r i x (OpenGL copy purpose )f l o a t ∗f v ( ) ;

. . .}

Mat r ix4 Matr ix4 : : fromOrtho ( double l e f t , double r i g h t , double bottom , double top , double znear , double z f a r ) {Mat r ix4 mat ;mat . row ( 0 , 2 . 0 / ( r i g h t− l e f t ) ,0 ,0 ,−( r i g h t + l e f t ) / ( r i g h t− l e f t ) ) ;mat . row (1 ,0 , 2 . 0 / ( top−bottom ) ,0 ,−( top+bottom ) / ( top−bottom ) ) ;mat . row (2 ,0 ,0 ,−2.0/( z fa r−znear ) ,−( z f a r +znear ) / ( z fa r−znear ) ) ;mat . row (3 ,0 ,0 ,0 ,1 ) ;return mat ;

}

Dans GLApplication :

p3d : : Mat r ix4 _ p r o j e c t i o n ; / / member. . ._ p r o j e c t i o n =Matr ix4 : : fromOrtho (−10 ,10 ,−10 ,10 ,0 ,100);

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 23 / 60

Page 24: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Exemple : paramètres (left,right,bottom,top,near,far)

_pos i t ionData ={−6,−2,−3, / / ve r tex 0 / / f i r s t t r i a n g l e ( red )0 ,3 ,−30 , / / ve r tex 15,−9,−15, / / ve r tex 2

5 ,8 ,−10 , / / ve r tex 3 / / second t r i a n g l e ( blue )15 ,2 ,−10 , / / ve r tex 4−2,−8,−20 / / ve r tex 5

} ;_ p r o j e c t i o n =Matr ix4 : : fromOrtho (−10 ,10 ,−10 ,10 ,0 ,100);

_pos i t ionData ={−6,−2,−3, / / ve r tex 0 / / f i r s t t r i a n g l e ( red )0 ,3 ,−30 , / / ve r tex 15,−9,−15, / / ve r tex 2

5 ,8 ,−10 , / / ve r tex 3 / / second t r i a n g l e ( blue )15 ,2 ,−10 , / / ve r tex 4−2,−8,−20 / / ve r tex 5

} ;_ p r o j e c t i o n =Matr ix4 : : fromOrtho (0 ,5 ,−7 ,−2 ,0 ,100);

I Remarque : noter l’effet de zoom ici.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 24 / 60

Page 25: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

4 Projection perspective

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 25 / 60

Page 26: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Exemple

_pos i t ionData ={−10,−10,−3,−10,10,−3,−1,−10,−3,−1,10,−3,

1,−10,−10,1 ,10 ,−10 ,10,−10,−10,10,10,−10

} ;_ p r o j e c t i o n =Matr ix4 : : fromOrtho (−12 ,12 ,−12 ,12 ,0 ,100);

_pos i t ionData ={−10,−10,−3,−10,10,−3,−1,−10,−3,−1,10,−3,

1,−10,−10,1 ,10 ,−10 ,10,−10,−10,10,10,−10

} ;_ p r o j e c t i o n =Matr ix4 : : fromFrustum (−1 ,1 ,−1 ,1 ,0.1 ,100);

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 26 / 60

Page 27: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Exemple

_pos i t ionData ={−10,−10,−2,−10,10,−10,−2,−10,−2,−2,10,−10,

1,−10,−5,1 ,10 ,−5 ,10,−10,−2,10,10,−2

} ;_ p r o j e c t i o n =Matr ix4 : : fromOrtho (−12 ,12 ,−12 ,12 ,0 ,100);

_pos i t ionData ={−10,−10,−2,−10,10,−10,−2,−10,−2,−2,10,−10,

1,−10,−5,1 ,10 ,−5 ,10,−10,−2,10,10,−2

} ;_ p r o j e c t i o n =Matr ix4 : : fromFrustum (−1 ,1 ,−1 ,1 ,0.1 ,100);

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 27 / 60

Page 28: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Projection perspective

I Exercice : quelle est la tranformation à appliquer à P(x ,y ,z) pour obtenir P′(x ′,y ′,z′)?(projection sur le plan −near ).

I Exercice : exprimer cette transformation en coordonnées homogènes.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 28 / 60

Page 29: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Calcul

I Droite de projection :P′ = O+λ

−→OP

I avec z′ =−near .

I z′ = λz =−near ⇒ λ = −nearz

I x ′ = x×near−z et y ′ = y×near

−z

I Passer en coordonnées homogènes ?

P′ =

x×neary×nearz×near−z

P ′ =

near 0 0 0

0 near 0 00 0 near 00 0 −1 0

P

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 29 / 60

Page 30: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Profondeur ?

I Avec ce calcul on perd la profondeur du point P (i.e. z ′ =−near pour tous les sommets).I Supposons, pour le moment, disposer de cette profondeur pour chacun des sommets : comment avoir la profondeur

pour chacun des pixels ?⇒ interpolation linéaire !I Exercice : profondeur z interpolée en Mp de M1, M2 et M3 ?

On devrait obtenir On obtiendra

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 30 / 60

Page 31: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Interpolation de la profondeur

I Même exercice mais en interpolant 1z ?

I L’interpolation du z donne une valeur fausse pour la profondeur des pixels en projectionperspective. Par contre 1

z est linéaire, et son interpolation donne une valeur correcte.

P ′ =

near 0 0 0

0 near 0 00 0 0 10 0 −1 0

P

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 31 / 60

Page 32: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Matrice de projection perspective (frustum)

I Comme pour la projection orthogonale, on définit un volume de visualisation souple pour laprojection perspective, tout en tenant compte de la profondeur en 1

z .

xCC

yCC

zCC

wCC

=

2 near

right−left 0 right+leftright−left 0

0 2 neartop−bottom

top+bottomtop−bottom 0

0 0 − far+nearfar−near −2 far∗near

far−near0 0 −1 0

xEye

yEye

zEye

wEye = 1.0

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 32 / 60

Page 33: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Correction perspective

I Le problème de l’interpolation en projection perspective existe aussi pour les coordonnéesde texture.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 33 / 60

Page 34: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Correction perspectiveI Interpoler linéairement les coordonnées de texture fTexCoord (varying out du vertex shader) n’est pas correct.I Par contre : interpoler linéairement fTexCoord

z est correct.I Exemple :

I OpenGL interpole donc fTexCoord∗gl_Position.z à la sortie du vertex shader. Avant l’entrée dans le fragmentshader, OpenGL divise cette interpolation par l’interpolation de gl_Position.z pour obtenir fTexCoord (correct) enentrée du fragment shader.

I ⇒ il en est de même pour tous les varyings ! (par défaut : voir qualifiers flat, perspective, noperspective).I Cette opération s’appelle la correction de perspective (remarque : effectuée même s’il n’y a pas de projection

perspective...).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 34 / 60

Page 35: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Résumé du pipeline

I OpenGL :

I Coordonnées :

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 35 / 60

Page 36: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

5 Eclairement

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 36 / 60

Page 37: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Eclairement

I Si les triangles sont remplis, il est nécessaire d’avoir une simulation d’éclairage pour avoirune perception correcte de la forme 3D.

⇒ calcul de la couleur provenant de 2 contributions : réflexion diffuse (couleur mat) etréflexion spéculaire (couleur brillante = tâche spéculaire).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 37 / 60

Page 38: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Produit scalaire (dot product)

I Apparait pour : équations algébriques (plan), test d’intersection, test de localisation (d’unpoint par rapport à un plan, ...), éclairement (angle d’incidence de la direction d’éclairementsur un objet), orientation (tests de directions « opposées » ), ...

Soient u =

ux

uy

uz

, v =

vx

vy

vz

:

I Le produit scalaire donne un nombre.

I u · v = ux vx +uy vy +uzvz (calcul valable uniquement dans un repère orthornormé).

I Norme d’un vecteur : ‖u‖=√

u ·u =√

ux ux +uy uy +uzuz

I Normer un vecteur u signifie le « rendre »de norme 1 (ou unitaire) : u′ = u‖u‖

I Autre calcul du produit scalaire : u · v = ‖u‖‖v‖cos(u,v)

I Si u et v sont normés, u · v ∈ [−1,1]

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 38 / 60

Page 39: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Interprétation du produit scalaire

I Projection :

u

v

h

I u · v = u ·hI ‖h‖= |u·v |

‖u‖

I Si u est unitaire : h = (u.v)u

I Angle et localisation :

u · v = 0 (orthonormal) u · v > 0 (aigu) u · v < 0 (obtus)

I Si u et v unitaires alors u · v = cos(u,v) (donne un nombre dans [−1,1].

I acos(u · v) donne alors l’angle entre u et v dans [0,π].

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 39 / 60

Page 40: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Produit vectoriel (cross product)

I Apparait pour : détermination de normales (vecteur orthogonal à un plan), construction devecteurs (repères par exemple), construction d’orientations (définition d’un sensdirect-indirect), ...

Soient u =

uxuyuz

, v =

vxvyvz

: w = u× v =

uy vz − vy uzuzvx − vzuxux vy − vx uy

u

v

u∧v

I Si u et v colinéaires (i.e. u = λv ) alors u× v = 0

I w est orthogonal à u et v .

I w est orienté tel que (u,v ,w) est direct (rêgle de la maindroite)

I ‖w‖= ‖u‖‖v‖|sin(θ)|

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 40 / 60

Page 41: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Remarques sur le produit vectoriel

I Attention le produit vectoriel est non commutatif : u× v =−v×u (changement de signe).

I Un vecteur orthogonal à un polygone est appelé une normale et peut être calculé parproduit vectoriel si on connait les sommets.

I Exemple d’un triangle (A,B,C) : n =−→AB×−→BC est une normale.

I La normale d’un triangle (A,B,C) sera dite directe si les sommets A, B et C sont décritsdans le sens trigonométrique par rapport à la normale (en regardant la normale pointéevers soi).

I sens trigonométrique = sens contraire des aiguilles d’une montre.

N

A

B

C

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 41 / 60

Page 42: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Classe Vector3

I Nécessité d’une classe sur les points et les vecteurs.I On confond généralement points et vecteurs dans la même classe (à l’utilisateur de savoir

ce qu’il manipule).

class Vector3 {private :

double c [ 3 ] ; / / c [ 0 ] = x , c [ 1 ] = y , c [ 2 ] = z

public :/ / / cons t ruc ts the vec to r ( x , y , z )Vector3 ( double x , double y , double z ) ;/ / / g e t t e r sdouble x ( ) const ;double y ( ) const ;double z ( ) const ;/ / / s e t t e r svoid x ( double k ) ;void y ( double k ) ;void z ( double k ) ;

/ / / r e tu rns the dot product a . bdouble dot ( const Vector3 &a , const Vector3 &b ) const ;

/ / / r e tu rns the cross product a x bVector3 cross ( const Vector3 &a , const Vector3 &b ) const ;

/ / / f u n c t i o n add : p=p1+p2f r i e n d Vector3 opera tor +( const Vector3 &a , const Vector3 &b ) ;

. . .

} ;

I Remarque : ces opérations existent en GLSL pour manipuler le type vec3.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 42 / 60

Page 43: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Eclairement

I Pour ajouter du réalisme et pour la perception de la 3D, on propose de calculer la couleurdes pixels pour simuler un éclairement de la scène par des sources lumineuses.

⇒ calcul de la couleur provenant de 2 contributions : réflexion diffuse (couleur mat) etréflexion spéculaire (couleur brillante = tâche spéculaire).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 43 / 60

Page 44: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Données

Les données nécessaires au calcul d’éclairement sont :I Les sources (principalement la position).

I Le matériel des objets (caractéristiques qui traduisent comment est réfléchie la lumière dessources).

I Les composantes (rouge, vert, bleu) qui apparaissent dans la suite sont comprises entre 0et 1.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 44 / 60

Page 45: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Modèle d’éclairement

I On choisit le modèle empirique de Phong.

I Très simple, mais aussi très éloigné de la réalité.

I Le vecteur V est appelé vecteur d’observation, le vecteur L est appelé vecteurd’éclairement.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 45 / 60

Page 46: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Intensité diffuse 1/2

I On suppose qu’un objet (un matériel) diffuse la lumière reçue de manière uniforme danstoutes les directions.

I L’intensité perçue ne dépend donc pas de la position de l’observateur par rapport au pointéclairé.

I L’intensité sera un nombre calculé entre 0 et 1 (1 = éclairement maximal, 0 = éclairementnul).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 46 / 60

Page 47: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Intensité diffuse 2/2

I L’intensité dépend de l’angle d’incidence des rayons lumineux sur la surface de l’objet

• un éclairement direct (i.e. la lumière arrive orthogonalement à la surface) donne uneintensité maximale.

• un éclairement fuyant (i.e tangent à la surface) donne une intensité nulle.• ⇒ prise en compte de la normale N (i.e. vecteur orthogonal) à la surface au point P.• on souhaite que l’intensité varie « continuement »entre ces 2 positions extrèmes de la

manière la plus réaliste possible.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 47 / 60

Page 48: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Calcul de l’intensité diffuse

I On supposera toujours que N et L sont normés pour ce calcul (‖N‖= ‖L‖= 1).

I Le calcul de l’intensité du diffus par cos(N,L) est un « bon »choix.

I Comme les vecteurs sont de norme 1 : cos(N,L) = N ·LI ⇒ il suffit de calculer N ·L.

I seul le « coté »dirigé par la normale est éclairé : intensité = max(dot(N,L),0.0) (siN ·L < 0 alors éclairement nul).

I ⇒ important de spécifier correctement le sens de la normale.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 48 / 60

Page 49: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Traduction en OpenGL

I On se contente ici de calculer l’éclairement diffus uniquement aux sommets :• On donne le vecteur normal en chaque sommet (attribut du vertex shader).• On calcule l’intensité lumineuse dans le vertex shader.• ⇒ obtention d’une couleur en chaque sommet.

I La couleur des pixels lors de la rasterization est alors simplement obtenue par interpolationlinéaire des couleurs.

I ⇒ approximation convenable.

⇒ l’interpolation linéaire des couleurs, dans le cadre de l’éclairement est appeléeinterpolation de Gouraud.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 49 / 60

Page 50: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Shaders

# vers ion 130

i n vec3 p o s i t i o n ; / / l a p o s i t i o ni n vec3 normal ; / / l a normale

uni form mat4 p r o j e c t i o n ;uni form vec3 l i g h t P o s i t i o n ; / / p o s i t i o n de l a source lumineuse

out vec4 fCo lo r ;

void main ( ) {vec3 L= l i g h t P o s i t i o n−P; / / L = Source−Pvec3 N=normal ;

L=normal ize ( L ) ;N=normal ize (N ) ;

f l o a t i n t e n s i t e = max( dot (N, L ) , 0 . 0 ) ;

fCo lo r = vec4 ( i n t e n s i t e , i n t e n s i t e , i n t e n s i t e , 1 ) ;

g l _ P o s i t i o n = p r o j e c t i o n∗vec4 ( pos i t i on , 1 . 0 ) ;}

# vers ion 130

i n vec4 fCo lo r ;

out vec4 f ragCo lo r ;

void main ( ) {f ragCo lo r= fCo lo r ;

}

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 50 / 60

Page 51: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

MaterielI Pour avoir une couleur quelconque il suffit de multiplier l’intensité par la couleur souhaitée (cette couleur

diffuseColor fait partie des caractéristiques du matériel de l’objet tracé).

# vers ion 130

i n vec3 p o s i t i o n ; / / l a p o s i t i o ni n vec3 normal ; / / l a normale

. . .

un i form vec4 d i f f u s e C o l o r ;

void main ( ) {. . .

f l o a t i n t e n s i t e = max( dot (N, L ) , 0 . 0 ) ;

fCo lo r = i n t e n s i t e∗d i f f u s e C o l o r ;

g l _ P o s i t i o n = p r o j e c t i o n∗vec4 ( pos i t i on , 1 . 0 ) ;}

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 51 / 60

Page 52: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Normales 1/3

I On donne une normale à chaque sommet pour le calcul d’éclairement.

I Fournir le vecteur orthogonal au polygone tracé ?⇒ pas nécessairement (liberté totale dedonner la normale qu’on souhaite).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 52 / 60

Page 53: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Normales 2/3

I Pouvoir spécifier une normale différente en chaque sommet permet d’obtenir uneapproximation de la forme courbe souhaitée.

I ⇒ permet d’obtenir une perception d’un objet lisse en calculant correctement les normales.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 53 / 60

Page 54: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Normales 3/3

I Résultat pour le diffus :

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 54 / 60

Page 55: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Exemple de spécification des normales pour un objetcomplexe

I La normale de l’objet à représenter peut ne pas être connue et difficilement calculable.

I ⇒ Prendre la moyenne des normales aux facettes incidentes au sommet peut donner unebonne approximation de la surface lisse.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 55 / 60

Page 56: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Effets « spéciaux »avec les normales

I Seule la normale traduit la forme géométrique courbe.

I Le calcul d’éclairement donne alors la perception de relief.

I il s’agit du principe appliqué par la technique dite du « Bump mapping » : spécifier lesnormales d’un relief sans toucher à la géométrie de l’objet.

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 56 / 60

Page 57: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

6 FRONT/BACK

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 57 / 60

Page 58: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Orientation d’un triangle : FRONT/BACK

I Un polygone est dit frontal si sa projection à l’écran est orienté direct (est dit arrière sinon).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 58 / 60

Page 59: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Remarques

I Pour les facettes convexes (V1,V2,V3, ...), le signe de V1projV2proj ∧V2projV3proj (=

déterminant) suffit pour déterminer si la facette est frontale ou non.

I Un point P est dit frontal s’il est élément d’une facette frontale.

I Si N est la normale directe (appliquée en P), alors P est frontal ssi V .N > 0.

I (⇒ on peut appliquer la notion frontal/arrière à des objets non décrits par polygones).

F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 59 / 60

Page 60: Chapitre 2 : OpenGL 3D Elimination parties cachées ...aubert/m3ds/m3ds_openGL3D.pdf · P0=TP avec T = 0 B B @ 1 ... 0 0 0 1 1 C C A I La matrice 4x4 T est appelée matrice homogène

Propriété (back face culling)

I Pour une surface close (frontière entre l’intérieur et l’extérieur d’un volume) bien orientée(faces directes vers l’extérieur) et pour un observateur placé à l’extérieur du volume :

• une facette arrière correspond à la face intérieure au volume (i.e. le coté du polygonequi fait face à l’observateur est intérieur au volume).

• ⇒ les facettes arrières sont donc nécessairement occultées (i.e. l’observateur ne voitpas l’intérieur).

• ... donc inutile de les tracer⇒ élimination des faces arrières ou « back faceculling ».

I En OpenGL :• glCullFace(GL_BACK) ou glCullFace(GL_FRONT) pour indiquer les faces à

éliminer• glEnable(GL_CULL_FACE) pour activer l’élimination des faces arrières (élimine la

phase de rasterization sur les polygones arrières).F. Aubert (MS2) M3DS/ 2 - OpenGL 3D 2015-2016 60 / 60