Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
Chapitre 4 : OpenGL 3DEclairage par modèle de Phong
Modélisation 3D et Synthèse
Master Informatique
2019-2020
[email protected] 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).
[email protected] M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 2 / 36
1 Produit scalaire et produit vectoriel
[email protected] 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]
[email protected] 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,π].
[email protected] 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(θ)|
[email protected] 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
[email protected] 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 ) ;
[email protected] 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).
[email protected] 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.
[email protected] 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.
[email protected] 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).
[email protected] 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.
[email protected] 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.
[email protected] 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.
[email protected] 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 ;
}
[email protected] 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 ) ;}
[email protected] 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).
[email protected] 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.
[email protected] M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 19 / 36
Normales 3/3
I Résultat pour le diffus :
[email protected] 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.
[email protected] 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.
[email protected] M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 22 / 36
2 FRONT/BACK
[email protected] 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).
[email protected] 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).
[email protected] 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)[email protected] 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 :
[email protected] 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.
[email protected] 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 ) ;}
[email protected] 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 ;}
}
[email protected] 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.
[email protected] 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
[email protected] 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)
[email protected] 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
[email protected] 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é.
[email protected] 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).
[email protected] M3DS/ 4 - OpenGL - Phong Master Informatique2019-2020 36 / 36