OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void...

21
OpenGL Didier Verna ENST VIHM Fog Blending Ombres Réflections Stencil Résultat OpenGL Effets Spéciaux Didier Verna [email protected] http://www.lrde.epita.fr/˜didier Version ENST –VIHM du 3 septembre 2008 1/27

Transcript of OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void...

Page 1: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

OpenGLEffets Spéciaux

Didier Verna

[email protected]://www.lrde.epita.fr/˜didier

Version ENST – VIHM du 3 septembre 2008

1/27

Page 2: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

License d’exploitation

Ce document est mis à votre disposition sous un contrat de license Creative Commons – Common Deed. Parle téléchargement ou la consultation de ce document, l’utilisateur accepte les conditions d’utilisation décritespar cette license et s’engage à la respecter intégralement.

La licence confère à l’utilisateur un droit d’usage sur le document consulté ou téléchargé, totalement ou enpartie, dans les conditions définies ci-après et à l’exclusion expresse de toute utilisation commerciale.

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend:

le droit de reproduire tout ou partie du document sur support informatique ou papier,

le droit de diffuser tout ou partie du document au public sur support papier ou informatique, y comprismise à la disposition du public sur un réseau numérique.

Aucune modification du document dans son contenu, sa forme ou sa présentation n’est autorisée. Lesmentions relatives à la source du document et/ou à son auteur doivent être conservées dans leur intégralité.

Le droit d’usage défini par la licence est personnel, non exclusif et non transmissible. Tout autre usage que

ceux prévus par la licence est soumis à autorisation préalable et expresse de l’auteur.

2/27

Page 3: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Table des matières

1 Fog

2 Blending

3 Ombres portées

4 Réflections

5 Le stencil buffer

6 Résultat

3/27

Page 4: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

FogUn effet qui ne coûte pas cher

Utilisation : Simulation d’effets atmosphériques(brouillard, pollution etc.)Caractéristiques :

I Uniformisation de l’apparence avec l’éloignementI Limitation effective de la visibilité (d’où optimisations)

Fonctionnement :I Contrôle de la densitéI Contrôle de la couleurI Application après transformations, lumières, textures

(Dés) Activation :glEnable / glDisable (GL_FOG);

5/27

Page 5: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

UtilisationLa fonction OpenGL

void glFog{if }{v} (GLenum pname, TYPE pvalue);Spécifie tous les paramètres définissant le fog.

Couleur :pname : GL_FOG_COLORpvalue : (R,G,B,A)Équation :pname : GL_FOG_MODEpvalue : GL_LINEAR, GL_EXP, GL_EXP2Paramétrage :pname : GL_FOG_DENSITY, GL_FOG_START,GL_FOG_ENDpvalue : valeur correspondante pour l’équation de fog

6/27

Page 6: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Équations de fogSémantique des paramètres

GL_LINEAR : f = end−zend−start

GL_EXP : f = e−(density.z)

GL_EXP2 : f = e−(density.z)2

01

1

Distance

Ratio

LINEAREXP

EXP2

7/27

Page 7: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

BlendingLa vérité sur α enfin dévoilée !

Utilisation :I Simulation de transparence / transluciditéI Rendu non rectangulaire de texture (« billboarding »)

Caractéristiques :I Combinaison entre source (fragment) et destination

(frame buffer)I Fonction de combinaison paramétrable par les

composantes α

I Application après rasterisationFonctionnement :

I Sr +Dr⇒ Bsr.Sr +Bdr.DrSg +Dg⇒ Bsg.Sg +Bdg.DgSb +Db⇒ Bsb.Sb +Bdb.Db

I La composante alpha est un facteur d’opacité

9/27

Page 8: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Fonction OpenGLExemples de paramètres

Paramétrisation :void glBlendFunc (GLenum src, GLenum dst);Spécifie les paramètres définissant le blending.

Constante Facteur BGL_ZERO (0,0,0,0)GL_ONE (1,1,1,1)GL_SRC_ALPHA (Sar,Sag,Sab,Saa)GL_DST_ALPHA (Dar,Dag,Dab,Daa)GL_ONE_MINUS_SRC_ALPHA (1−Sar,1−Sag,1−Sab,1−Saa)GL_ONE_MINUS_DST_ALPHA (1−Dar,1−Dag,1−Dab,1−Daa)

(Dés) Activation :glEnable / glDisable (GL_BLEND);

10/27

Page 9: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

ExemplesPour fixer les idées

Mélange de deux images à 50% :I Tracer l’image de départ sans blendingI Tracer la deuxième image avec src et dst àGL_SRC_ALPHA, et α = 0.5

Mélange de deux images à 75/25% :I Tracer l’image de départ sans blendingI Tracer la deuxième image avec src à GL_SRC_ALPHA,dst à GL_ONE_MINUS_SRC_ALPHA, et α = 0.25

Application aux ombres portées, reflets etc.

11/27

Page 10: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Problèmes / PrécautionsC’était trop simple. . .

Utilisation des paramètres *_DST_* :I Nécessite un color buffer de type RGBAI Pas disponible partout (jamais en émulation !)

Ordre de tracé :I La couleur finale en dépend

Depth Buffer :I Certains objets cachés doivent être tracésI Tracer les objets translucides après les autresI Utiliser un z-buffer en lecture seule

12/27

Page 11: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Projection d’ombresOmbres portées 6= Ombrage

Une ombre portée est la trace d’un objet à travers uneprojection.Idée : tracer deux fois le même objet, dont une à traversune matrice de projection, mais en mode Modelview ! !

14/27

Page 12: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Projection directionnelle sur un planUn peu de maths, pour une fois. . .

Équation d’un plan : a.x+b.y+ c.z+d = 0

Direction de projection :−−−−−−→(dx,dy,dz)

Principe : pour tout point (Sx,Sy,Sz) de l’espaceEuclidien, trouver l’intersection de la droite S +α

−→D

avec le plan concerné.

P =

b.dy + c.dz −b.dx −c.dx −d.dx

−a.dy a.dx + c.dz −c.dy −d.dy

−a.dz −b.dz a.dx +b.dy −d.dz

0 0 0 a.dx +b.dy + c.dz

Coordonnées homogènes : OpenGL n’apprécie pasles w < 0

15/27

Page 13: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Problèmes / PrécautionsC’était trop simple. . .

Apparence des ombres portées :I Devrait dépendre des conditions d’éclairageI Objets opaques : faire du blending avecsrc = GL_ZERO et dst = GL_SRC_ALPHA

I Objets translucides : blending assombri entre le planet l’objet projeté

Collision ombres / plan :I SurélévationI Offset

Débordement des ombres :I Limitation du tracéI Stencil Buffer

16/27

Page 14: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Réflections d’objetsUn effet qui demande réflection

Une réflection est la trace d’un objet à travers unesymétrie.Idée : tracer deux fois le même objet, dont une à traversune matrice symétrisant l’objet par rapport au plan.

18/27

Page 15: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Problèmes / PrécautionsC’était trop simple. . .

Symétrisation horizontale :I glScalef (1.0, -1.0, 1.0);I Inversion des faces des polygones (attention au culling)

Apparence des reflets :I Renversement des lumièresI Blending entre les reflets et le plan

Débordement des reflets :I Limitation du tracéI Stencil Buffer

19/27

Page 16: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Le Stencil BufferUn troisième buffer d’OpenGL

Utilisation typique :I limitation du tracé (masquage de régions)

Caractéristiques :I Conditionnement du tracé par le « stencil test »

Fonctionnement :I Buffer contenant des entiers (nombre de bits variable)I Une fonction paramétrable pour le testI une opération paramétrable pour la modification du

buffer

21/27

Page 17: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Fonction et Opération de stencilLes deux mamelles du dessin

void glStencilFunc (GLenum func, GLint ref, GLuint mask);Spécifie la function de test, qui compare la valeur dereférence avec la valeur actuelle dans le stencil buffer,mais seulement sur les bits du mask.func : GL_NEVER, GL_ALWAYS, GL_EQUAL, GL_LESS,GL_LEQUAL etc.

void glStencilOp (GLenum fail, GLenum zfail,

GLenum zpass);Spécifie les opérations de modification du buffer, quand letest échoue, quand le z-test échoue, et quand le z-testréussi.fail, zfail, zpass : GL_KEEP, GL_ZERO, GL_REPLACEetc.

22/27

Page 18: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

(Dés) Activation et nettoyage du stencil bufferToujours le même refrain

Requête :I GLX : glXChooseVisual() avecGLX_STENCIL_SIZE

I GLUT :glutInitDisplayMode() avecGLUT_STENCIL

(Dés) Activation :glEnable / glDisable (GL_STENCIL_TEST);

Nettoyage :void glClearStencil (GLint val );Spécifie la valeur de nettoyage du stencil buffer.

glClear (GL_STENCIL_BUFFER_BIT);Nettoie le stencil buffer.

23/27

Page 19: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Application (ombres et réflections)Un scénario possible

1 Tracer le plan dans le stencil buffer :I Valeur de référence à 1I Le test de stencil doit toujours réussir : fonctionGL_ALWAYS

I La valeur de stencil doit être remplacée : opérationGL_REPLACE

2 Tracer les reflets :I Test de stencil : est-on sur le plan ? GL_EQUALI Opération de stencil : conservation : GL_KEEP

3 Tracer le plan normalement4 Tracer les ombres (même combat que pour les

réflections)5 Tracer les objets réels

24/27

Page 20: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Dernières considérationsLa touche finale

Problème : ne pas tracer le plan dans le color bufferquand on le trace dans le stencil buffer

I Solution :void glDrawBuffer (GLenum mode);

Spécifie le mode de tracé dans le(s) color buffer(s).mode : GL_NONE, GL_BACK, GL_FRONT, etc.

Améliorations : pendant le tracé du plan dans lestencil buffer, pas besoin de depth test, de lumière,d’ombrage etc.

25/27

Page 21: OpenGL - Effets Spéciauxdidier/lectures/opengl/vihm...Les deux mamelles du dessin void glStencilFunc (GLenum func, GLint ref, GLuint mask); Spécifie la function de test, qui compare

OpenGL

Didier VernaENSTVIHM

Fog

Blending

Ombres

Réflections

Stencil

Résultat

Résultat du TP

27/27