Éclairage, ombrage Fiat lux !
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Modèles d’éclairage Déterminent la couleur en chaque point de la surface en fonction de propriétés optiques et/ou empiriques. La normale à une surface en un point = vecteur dont la direction est perpendiculaire à la surface. glNormal3{b|d|f|i|s} (nx, ny, nz) glNormal3{b|d|f|i|s}v (const TYPE *) Tant que l’on ne fait pas de nouveau appel à glNormal, tous les sommets ont pour normale [nx ny nz]. Les normales sont supposées être unitaires ! Si toutefois la fainéantise vous submerge… glEnable (GL_NORMALIZE) 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Éclairage Lambert Modèle physique basé sur la loi de Lambert. Surfaces idéalement diffuses (= lambertiennes) Cd = Kd*Ld*cosθ = Kd*Ld*(N∙L) avec Kd le coefficient diffus, Ld la lumière diffuse incidente, N la normale à la surface et L le vecteur de la surface à la lampe. 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Éclairage Phong Développé par Bui Tuong Phong en 1973. Perception des tâches de réflexion spéculaire. Cs = Ks*Ls*cosnφ = Ks*Ls*(V∙R)n avec V la direction de vision, R le vecteur de réflexion spéculaire et n le coefficient de brillance. Crédits: fr.wikipedia.org 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Éclairage Blinn-Phong Éclairage & ombrage Éclairage Blinn-Phong Proposé par Jim Blinn en 1977. Version simplifiée/accélérée de l’éclairage Phong. Évaluation de R relativement coûteuse. Cs = Ks*Ls*(N∙H)n Crédits: fr.wikipedia.org 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Lumière OpenGL distingue 4 types de lumière : Lumière émise GL_EMISSION Lumière ambiante GL_AMBIENT Lumière diffuse GL_DIFFUSE Lumière spéculaire GL_SPECULAR GL_SHININESS Pour les 4 composantes R, G, B & A : C = Ke + Ka*Ga + ∑(Kd*Ld*V∙R + Ks*Ls*(N∙H)n) 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Matériaux Notion de face intérieure/extérieure. GL_FRONT / GL_BACK / GL_FRONT_AND_BACK glMaterialf (GLenum face, GLenum param, GLfloat value) Propriétés de matériau à paramètre unique. GL_SHININESS glMaterialfv (GLenum face, GLenum param, GLfloat * values) Propriétés à paramètres multiples (R, G, B & A) GL_EMISSION GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_AMBIENT_AND_DIFFUSE 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Lampes glEnable (GL_LIGHTING) Active l’éclairage. glEnable (GL_LIGHT0) Active la 1ère lampe / 8 (GL_LIGHT0 GL_LIGHT7) . glLightf (GLenum light, GLenum param, GLfloat value) glLightfv (GLenum light, GLenum param, GLfloat * values) Associe les valeurs au paramètre param de la lampe light. Lampes positionnelles Lampes directionnelles Lampes omnidirectionnelles Lampes spots Couleur de la lumière Coefficients d’atténuation. 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Éclairage & ombrage Modèles d’ombrage glShadeModel (GL_FLAT) 1 normale pour 1 facette (flat) Éclairage Blinn-Phong sur la facette. glShadeModel (GL_SMOOTH) 1 normale pour 1 sommet (Henri Gouraud, 1971) Éclairage Blinn-Phong sur chaque sommet. Interpolation bilinéaire le long du triangle. Et l’ombrage Phong ? 1 normale pour 1 pixel Normale interpolée le long du triangle. Éclairage Blinn-Phong sur chaque pixel. Nécessite la mise en œuvre d’un pixel shader. 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Élimination des faces cachées
Introduction à la programmation graphique - A. Benassarou Faces cachées Algorithme du peintre Si tous les triangles sont affichés dans n’importe quel ordre, le dernier affiché recouvrira tous les autres, qu’ils soient devant ou derrière lui. L’algorithme du peintre propose de dessiner les polygones du plus lointain au plus proche. Cet algorithme est coûteux car il faut trier tous les polygones. Pour trier n primitives, il faut au minimum n log(n) opérations. Problèmes potentiels dus aux intersections. Crédits: fr.wikipedia.org 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Faces cachées Z-buffer L’algorithme du Z-buffer permet de résoudre le problème des faces cachées à coût constant. L’utilisation d’un 2ème buffer, de dimensions égales à celles du framebuffer, permet de conserver la profondeur associée à chaque pixel. Pour chaque pixel, on peut ainsi déterminer si celui-ci doit être conservé ou écrasé par un autre simplement en comparant les deux profondeurs. glutInitDisplayMode (GLUT_DEPTH | …) Déclaration du Z-buffer. glEnable (GL_DEPTH_TEST) Activation du test de profondeur. glClear (GL_DEPTH_BUFFER_BIT | …) Effacement simultané des deux buffers. 2006 / 2007 Introduction à la programmation graphique - A. Benassarou
Introduction à la programmation graphique - A. Benassarou Faces cachées Culling L’étape de rasterization est la plus coûteuse. Certes, le Z-buffer permet de générer correctement les images mais il n’évite pas les calculs engendrés par les faces cachées. Besoin d’un test simple, qui élimine un grand nombre de primitives ! Produit scalaire entre V et N. Élimine en moyenne 50% des facettes. glEnable (GL_CULL_FACE) glCullFace (GLenum mode) 2006 / 2007 Introduction à la programmation graphique - A. Benassarou