Chapitre 4 : OpenGL 3D Eclairage par modèle de Phong ...aubert/m3ds/m3ds_openGL3DPhong.pdf ·...

Preview:

Citation preview

Chapitre 4 : OpenGL 3DEclairage par modèle de Phong

Modélisation 3D et Synthèse

Master Informatique

2019-2020

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 1 / 36

Objectif

I Modèle de Phong = calcul de la couleur provenant de 2 contributions : la réflexion diffuse(couleur mat) et réflexion spéculaire (couleur brillante = tâche spéculaire).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 2 / 36

1 Produit scalaire et produit vectoriel

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 3 / 36

Produit scalaire (dot product)

I Apparait pour : équations algébriques (plan), test d’intersection, test de localisation (d’unpoint par rapport à un plan, ...), éclairage (angle d’incidence de la direction d’éclairage surun 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]

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 4 / 36

Interprétation du produit scalaire

I Projection :

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,π].

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 5 / 36

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(θ)|

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 6 / 36

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

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 7 / 36

Classe Vector3

I On confond généralement points et vecteurs dans la même classe (à l’utilisateur de savoirce qu’il manipule).

class Vector3 {

public :/ / / cons t ruc ts the vec to r ( x , y , z )e x p l i c i t Vector3 ( double x =0.0 , double y =0.0 , double z = 0 . 0 ) ;/ / / 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 ) ;

. . .private :

s td : : array <double ,3 > c_ { 0 . 0 , 0 . 0 , 0 . 0 } ; / / x=c_ [ 0 ] , y=c_ [ 1 ] , z=c_ [ 2 ]

} ;

/ / / @brief Ex : p=p1+p2Vector3 opera tor +( Vector3 a , const Vector3 &b ) ;/ / / @return the dot product a . bdouble dot ( const Vector3 &a , const Vector3 &b ) ;/ / / @return the cross product v1 x v2Vector3 cross ( const Vector3 &v1 , const Vector3 &v2 ) ;

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 8 / 36

Eclairage

I Pour ajouter du réalisme et pour la perception de la 3D, on propose de calculer la couleurdes pixels pour simuler un éclairage 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).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 9 / 36

Données

Les données nécessaires au calcul d’éclairage 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.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 10 / 36

Modèle d’éclairage

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é vecteur d’éclairage.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 11 / 36

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 = éclarage maximal, 0 = éclairage nul).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 12 / 36

Intensité diffuse 2/2

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

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

• un éclairage 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.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 13 / 36

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 éclairage nul).

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

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 14 / 36

Traduction en OpenGL

I On se contente ici de calculer la réflexion diffuse 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’éclairage est appeléeinterpolation de Gouraud.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 15 / 36

Shaders

# vers ion 330

layou t ( l o c a t i o n =0) i n vec3 p o s i t i o n ; / / l a p o s i t i o nl ayou t ( l o c a t i o n =1) i 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 330

i n vec4 fCo lo r ;

out vec4 f ragCo lo r ;

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

}

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 16 / 36

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 330

layou t ( l o c a t i o n =0) i n vec3 p o s i t i o n ; / / l a p o s i t i o nl ayou t ( l o c a t i o n =1) i 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 ) ;}

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 17 / 36

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).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 18 / 36

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.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 19 / 36

Normales 3/3

I Résultat pour le diffus :

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 20 / 36

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.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 21 / 36

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.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 22 / 36

2 FRONT/BACK

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 23 / 36

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).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 24 / 36

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).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 25 / 36

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 polygone

qui fait face à l’observateur est intérieur au volume).• ⇒ les facettes arrières sont donc nécessairement occultées (i.e. l’observateur ne voit

pas l’intérieur).• ... donc inutile de les tracer⇒ élimination des faces arrières ou « back face

culling ».

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).fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 26 / 36

Orientation de la normale pour l’éclairement

I Un point P sera éclairé uniquement si sa normale N et le vecteur d’éclairage L sontorientés dans le "même sens" (N ·L > 0)

I Un point P FRONT (i.e. dont on voit la face directe) sera éclairé avec la normale N

I Un point P BACK sera éclairé avec l’opposée −N.

I ⇒ attention à la cohérence de l’orientation directe/indirecte pour l’ensemble des faces etau sens de la normale associée à chaque sommet.

Ces critères sont issus de l’étude des cas qui peuvent se présenter pour être toujourscohérent. Par exemple :

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 27 / 36

Eclairage ambiant

I Lorsqu’un point n’est pas directement éclairé par une source, il apparaitra complêtementnoir.

I On contre ce problème en donnant une couleur constante aux objets⇒ matériel ambiant.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 28 / 36

Vertex Shader

l ayou t ( l o c a t i o n =0) i n vec3 p o s i t i o n ;l ayou t ( l o c a t i o n =1) i n vec3 normal ;

uni form mat4 modelviewMatr ix ;uni form mat3 normalMatr ix ;uni form mat4 mvp ; / / p r o j e c t i o n M a t r i x∗modelviewMatr ix

uni form vec3 l i g h t P o s i t i o n ;uni form vec3 m a t e r i a l D i f f u s e ;uni form vec4 mater ia lAmbient ;

out vec4 fCo lo rFron t , fColorBack ;

void main ( ) {vec4 pos i t ionEye ;vec3 V, L ,N;f l o a t d i f f u s e I n t e n s i t y F r o n t , d i f f u s e I n t e n s i t y B a c k ;/ / compute l i g h t i n g data i n Eye coord ina tes :pos i t ionEye=modelviewMatr ix∗vec4 ( pos i t i on , 1 ) ;V=−pos i t ionEye . xyz / pos i t ionEye .w;L= l i g h t P o s i t i o n +V;N=normalMatr ix∗normal ;

/ / normal ize a l l vec to rsL=normal ize ( L ) ; V=normal ize (V ) ; N=normal ize (N ) ;

/ / d i f f u s e i n t e n s i t y f o r f r o n t and backf l o a t NdotL=dot (N, L ) ;d i f f u s e I n t e n s i t y F r o n t =max( NdotL , 0 ) ;d i f f u s e I n t e n s i t y B a c k =max(−NdotL , 0 ) ;

/ / co l o r = ambient + d i f f u s e ( d i s t i n c t ma te r i a l s f o r f r o n t and back could be def ined )fCo lo rF ron t = d i f f u s e I n t e n s i t y F r o n t∗vec4 ( ma te r i a lD i f f use ,1 )+ mater ia lAmbient ;fColorBack= d i f f u s e I n t e n s i t y B a c k∗vec4 ( ma te r i a lD i f f use ,1 )+ mater ia lAmbient ;

g l _ P o s i t i o n =mvp∗vec4 ( pos i t i on , 1 ) ;}

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 29 / 36

Fragment Shader

i n vec4 fCo lo rF ron t ;i n vec4 fColorBack ;

out vec4 f ragCo lo r ;

void main ( ) {i f ( g l_FrontFac ing ) {

f ragCo lo r= fCo lo rF ron t ;}else {

f ragCo lo r=fColorBack ;}

}

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 30 / 36

Spéculaire

I La spécularité traduit l’aspect « brillant »de l’objet.

I La réflexion spéculaire provient de la réflexion (au sens « miroir ») des rayons lumineux surl’objet.

I ⇒ on considère alors la direction miroir R du vecteur d’éclairage L (R est le symétrique deL par rapport à N).

I L’intensité de la réflexion spéculaire est maximale dans la direction R et est atténuée autourde cette direction R.

⇒ L’intensité perçue (i.e. la couleur) par l’observateur va donc dépendre de sa positionpar rapport à la direction R.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 31 / 36

Calcul de R

I H = (L.N)N (interprétation du produit scalaire par projection) et 2H = L+R (diagonalesse coupent en leur milieu).

I ⇒ R = 2(L ·N)N−L

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 32 / 36

Calcul spéculaire

I Le calcul de V .R (cosinus de l’angle entre V et R) donne une approximation correcte del’effet spéculaire (maximal dans la direction si R dirigé directement sur l’observateur ;atténué autour).

I Comme pour le diffus : on affecte une caractéristique Ks = (rouge,vert,bleu) pour lematériel.

I Ne pas oublier : tous les vecteurs doivent être normés (V .R = cos(V ,R) ∈ [−1,1])

⇒ CouleurSpéculaire(P) = Ks(V ·R)

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 33 / 36

Résultat

I Le calcul du spéculaire donne une « tache »lumineuse sur l’objet (conséquence de laréflexion des rayons lumineux).

I Pour accentuer ou atténuer l’effet autour de la direction principale, on donne également uncoefficient de brillance s.

I ⇒ CouleurSpéculaire(P) = Ks(V ·R)s

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 34 / 36

Spéculaire et Gouraud

I Spéculaire : très mal rendu s’il est calculé uniquement au sommet puis interpolé.

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 35 / 36

Interpolation de Phong

I On calcule la réflexion spéculaire en chacun des pixels (donc dans le fragment shader).

I Les vecteurs L,V ,N sont interpolés linéairement par rapport aux valeurs aux sommets(L,V ,N définies comme varying).

fabrice.aubert@univ-lille.fr M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 36 / 36

Recommended