Chapitre V : pipeline pixel - Programmation 3D
Transcription
Chapitre V : pipeline pixel - Programmation 3D
Chapitre V : pipeline pixel Programmation 3D Fabrice Aubert [email protected] Licence/Master USTL - IEEA 2008-2009 F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 1 / 33 1 Introduction F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 2 / 33 Rasterization La phase de « rasterization »consiste à calculer les fragments de chaque pixel lors du remplissage des polygones En un pixel (xi , yi ), le fragment tracé (fragment source) est susceptible de mettre à jour le fragment déjà présent (fragment destination) en (xi , yi ). Nous avons déjà parlé de cette phase lors de l’élimination des parties cachées avec le depth buffer : tout fragment subit le pipeline suivant : S i D e p t h T e s t p a s s e a l o r s // Par d é f a u t : s i d e p t h ( s o u r c e )<=d e p t h ( d e s t i n a t i o n ) c o u l e u r ( d e s t i n a t i o n ) <− c o u l e u r ( s o u r c e ) // i . e m i s e à j o u r de l a c o u l e u r d e p t h ( d e s t i n a t i o n ) <− d e p t h ( s o u r c e ) // i . e m i s e à j o u r de l a p r o f o n d e u r Fin s i Nous compléxifions maintenant ce pipeline pixel : Le blending consiste à mélanger les couleurs des fragments (exemple : effet de transparence). Le stencil permet de conditionner l’affichage du fragment (exemple : « trou »dans un plan). F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 3 / 33 Plan du chapitre 1 Coefficient alpha et blending 2 Test Alpha 3 Stencil Buffer F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 4 / 33 2 Coefficient alpha et blending F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 5 / 33 Coefficient alpha OpenGL est capable de gérer des buffers de couleurs qui ont 4 composantes : rouge, vert, bleu et alpha (sans interprétation visuelle à priori). Le coefficient alpha est un réel dans [0, 1] (comme les autres composantes). Il peut être spécifié avec glColor4f (rouge, vert , bleu , alpha) . Il peut être spécifié par le matériel : G L f l o a t mat [ ] = { 1 . 0 , 0 . 0 , 0 . 0 , 0 . 5 } ; // r o u g e a v e c a l p h a =0.5 g l M a t e r i e l f v (GL FRONT , GL DIFFUSE , mat ) ; Il peut être présent dans une texture (Ex : image à 4 « channels »). Attention à l’initialisation glut GLUT ALPHA : glutInitDisplayMode (GLUT ALPHA | GLUT DOUBLE | GLUT RGBA | GLUT DEPTH). F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 6 / 33 Interprétation du alpha Utilisation la plus courante : alpha = coefficient de transparence. 0 : objet totalement transparent (« invisible »). 1 : objet opaque ∈]0, 1[ : opacité intermédiaire. L’effet de transparence s’obtient simplement par un mélange de couleur. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 7 / 33 Transparence Objets opaques Polygone vert opaque à 40% : couleur = 0.4 vert + 0.6 destination (ce qui se trouve déjà à l’écran) ⇒ couleur destination ← 0.4 couleur source + (1-0.4) couleur destination. ⇒ On trace le carré vert avec un coefficient alpha = 0.4. Exercice : quel est le problème suivant l’ordre de tracé des polygones rouge et vert pour traduire la transparence ? F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 8 / 33 Blending (mélange des couleurs) En OpenGL on active le mélange des couleurs par : glEnable(GL BLEND). Une fois activée, la mise à jour de la couleur destination se fait par : couleur(destination) ← FacteurSource ∗ couleur(source)+ FacteurDestination ∗ couleur(destination) Cette instruction remplace donc couleur (destination) ← couleur (source) du pipeline pixel vu précédemment. Les valeurs sont éventuellements clampées à 1 (saturation). Ce calcul est effectué pour chacune des composantes rouge, vert, bleue et alpha. Les facteurs FacteurSource et FacteurDestination sont spécifiés par glBlendFunc. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 9 / 33 Facteurs de blending glBlendFunc(Fact Source, Fact Destination ) et Fact Destination peuvent être donnés par une quinzaine de constantes, dont : Fact Source GL ONE GL ZERO GL SRC ALPHA GL DST ALPHA GL ONE MINUS SRC ALPHA GL ONE MINUS DST ALPHA F. Aubert (LS6/MS2) (1,1,1,1) (0,0,0,0) (αsource , αsource , αsource , αsource ) (αdest , αdest , αdest , αdest ) (1, 1, 1, 1) − (αsource , αsource , αsource , αsource (1, 1, 1, 1) − (αdest , αdest , αdest , αdest ) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 10 / 33 Transparence par blending L’effet de transparence sur les polygones pourra alors être obtenu par (cf exemple des carrés rouge et vert) : glBlendFunc(GL SRC ALPHA,GL ONE MINUS SRC ALPHA) Attention à l’ordre de tracé ! F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 11 / 33 Exercice une scène est tracée avec l’affichage obtenu ? même question avec glBlendFunc(GL ONE,GL ZERO). Quel est glBlendFunc(GL ZERO,GL ONE) ? donnez un exemple où le coefficient alpha est intéressant pour les textures. une scène est constituée de polygones opaques et transparents. Quel doit être l’ordre de tracé des polygones pour avoir un effet correct de transparence ? F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 12 / 33 3 Test Alpha F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 13 / 33 Pipeline Nous avons vu le pipeline au niveau pixel pour l’élimination des parties cachées : // c h a q u e n o u v e a u f r a g m e n t s o u r c e au p i x e l ( x i , y i ) s u b i t : S i T e s t Depth p a s s e a l o r s // p a r d é f a u t , l e t e s t e s t // d e p t h s o u r c e <= d e p t h d e s t Maj (COLOR) // m i s e à j o u r de l a d e s t i n a t i o n Maj (DEPTH) // m i s e à j o u r de l a d e s t i n a t i o n fin si F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 14 / 33 Pipeline avec alpha Nous allons complexifier ce pipeline par le test alpha. On utilisera ce test pour proposer une pseudo solution pour le problème de l’ordre de tracé sur la transparence. S i Test Alpha p a s s e a l o r s S i T e s t Depth p a s s e a l o r s Maj (COLOR) Maj (DEPTH) fin si fin si Exploitation activé par : glEnable(GL ALPHA TEST). La nature du test est spécifié par F. Aubert (LS6/MS2) glAlphaFunc(operateur, valeur ) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 15 / 33 Test alpha L’opérateur est spécifié par une constante (GL EQUAL, GL GREATER, GL NEVER, GL LESS, GL EQUAL, GL LEQUAL, GL GREATER, GL NOTEQUAL, GL GEQUAL, GL ALWAYS). Exercice : en supposant que la scène est constituée de polygones opaques (α = 1.0) et transparents (α < 1.0), que fait : g l E n a b l e ( GL ALPHA TEST ) ; g l A l p h a F u n c ( GL EQUAL , 1 . 0 ) ; TracerScene ( ) ; F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 16 / 33 Illustration : transparence sans tri ? Pour bien gérer la transparence, il faut afficher les faces de la plus éloignée à la plus proche (plus aucun problème d’occultation des faces). Comment faire en OpenGL ? on trace tout d’abord « normalement » toutes les faces opaques (pas de problème de tris pour celles ci) on trace ensuite les transparentes telles qu’elles subissent l’occultation par les opaques, mais pas par les autres transparentes. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 17 / 33 Tracé en deux passes A c t i v e r ( f a c e s opaques uniquement ) ; TracerScene ( ) ; A c t i v e r ( f a c e s t r a n s p a r e n t e s uniquement ) ; TracerScene ( ) ; ⇒ utilisation de l’alpha test. Exercice : Discutez le résultat obtenu si on affiche les faces transparentes sans ordre particulier lorsque : 1 2 3 on désactive totalement l’élimination des parties cachées ou on désactive seulement le test du depth ou on désactive seulement la mise à jour du depth. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 18 / 33 Transparence sans tri Les faces transparentes ne doivent pas être occultées par les autres faces transparentes. Mais elles doivent être occultées par les faces opaques (qui sont déjà tracées). ⇒ Désactivation de la maj du depth buffer (ne cachera pas les tracés futurs), mais depth test toujours actif (subit l’élimination par ce qui a déjà été tracé dans le depth buffer). F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 19 / 33 Transparence sans tri g l E n a b l e ( GL ALPHA TEST ) ; // f a c e s o p a q u e s g l A l p h a F u n c ( GL EQUAL , 1 . 0 ) ; TracerScene ( ) ; // f a c e s t r a n s p a r e n t e s g l A l p h a F u n c ( GL LESS , 1 . 0 ) ; glDepthMask ( GL FALSE ) ; g l E n a b l e ( GL BLEND ) ; g l B l e n d F u n c ( GL SRC ALPHA , GL ONE MINUS SRC ALPHA ) ; TracerScene ( ) ; g l D i s a b l e ( GL BLEND ) ; glDepthMask ( GL TRUE ) ; g l D i s a b l e ( GL ALPHA TEST ) ; F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 20 / 33 Solution complète ? Attention : l’ordre est toujours important du fait de l’ordre de mélange ! ! Exercice : pourquoi ? et montrez le sur un exemple avec 3 faces transparentes de couleurs différentes qui se superposent à l’écran. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 21 / 33 4 Stencil Buffer F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 22 / 33 Le stencil buffer On complexifie encore le pipeline pixel en exploitant le stencil buffer. A chaque pixel est associé un entier stocké dans le stencil buffer. L’exploitation du stencil s’active (en mise à jour et test) par glEnable(GL STENCIL TEST) (nom de constante assez mal choisi comme pour le depth...). Effacement par glClear (GL STENCIL BUFFER BIT | GL COLOR BUFFER BIT...) Réservation mémoire pour OpenGL par glutInitDisplayMode (GLUT STENCIL | GLUT DOUBLE |...) F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 23 / 33 Application simple : cache F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 24 / 33 Le pipeline Les fragments sources subissent : si t e s t alpha passe a l o r s s i t e s t du s t e n c i l p a s s e a l o r s s i t e s t depth passe a l o r s maj ( d e p t h b u f f e r ) maj ( s t e n c i l b u f f e r ) // 3 e p a r a mè t r e de g l S t e n c i l O p maj ( c o l o r b u f f e r ) sinon maj ( s t e n c i l b u f f e r ) // 2 e p a r a mè t r e de g l S t e n c i l O p fin si sinon maj ( s t e n c i l b u f f e r ) // 1 e r p a r a mè t r e de g l S t e n c i l O p fin si fin si Remarque : la mise à jour des couleurs et du depth peut être faite uniquement si tous les tests passent. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 25 / 33 Contrôle du test du stencil Contrôle du test subit : glStencilFunc (<operateur>, <Reference>, <Masque>) L’opérateur est encore spécifié par une constante (GL ALWAYS, GL EQUAL, GL NEVER, GL LESS, GL LEQUAL, GL GREATER, GL GEQUAL, GL NOTEQUAL, GL ALWAYS). Le test du stencil passe ssi : ( R e f e r e n c e & Masque ) <o p e r a t e u r > ( v a l e u r du s t e n c i l d e s t i n a t i o n & Masque ) Le masque permet de sélectionner le bit ou le groupe de bits qu’on veut tester. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 26 / 33 Contrôle de la mise à jour du stencil Contrôle de la mise à jour par : g l S t e n c i l O p ( maj s i maj s i maj s i s t e n c i l ECHOUE, s t e n c i l REUSSI e t d e p t h ECHOUE, s t e n c i l REUSSI e t d e p t h REUSSI ) ; Chacune des mises à jour est spécifiée par une constante : GL ZERO, GL REPLACE, GL INCR, GL DECR, GL INVERT. GL KEEP, Remarque 1 : GL REPLACE affecte la destination (du stencil) avec la valeur de référence (donnée par le glStencilFunc ...). F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 27 / 33 Mise à jour du stencil Remarque 2 : la notion de « source »n’a pas de sens pour le stencil (on affecte toujours la destination selon la destination courante ou selon la référence). Remarque 3 : la mise à jour peut être autorisée ou interdite bit à bit par glStencilMask(<valeur binaire >). F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 28 / 33 Pour simplifier le pipeline Beaucoup d’effets visuels utilisant le stencil peuvent se contenter d’un raisonnement basé sur : si t e s t du s t e n c i l p a s s e a l o r s s i t e s t depth passe a l o r s maj ( d e p t h b u f f e r ) maj ( s t e n c i l b u f f e r ) maj ( c o l o r b u f f e r ) fin si fin si ⇒ pas de alpha, une seule possibilité de mise à jour (les autres paramètres de glStencilOp à GL KEEP). Utilisation d’un pseudo-code : Activer (MAJ STENCIL,1), ... F. Aubert (LS6/MS2) Activer (TEST DEPTH), Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 29 / 33 Cas d’école Stencil comme un simple « cache » A c t i v e r (MAJ STENCIL , 1 ) TracerPlan ( ) ; D e s a c t i v e r (MAJ STENCIL ) ; // Mouvement s o u r i s A c t i v e r (TEST STENCIL , =1); TracerVache ( ) ; D e s a c t i v e r (TEST STENCIL ) ; F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 30 / 33 Cas d’école 2 Si le plan bouge avec l’objet : // mouvement s o u r i s A c t i v e r (MAJ STENCIL , 1 ) TracerPlan ( ) ; D e s a c t i v e r (MAJ STENCIL ) ; A c t i v e r (TEST STENCIL , =1); TracerVache ( ) ; D e s a c t i v e r (TEST STENCIL ) ; ⇒ bien retenir que les opérations de stencil sont des opérations au niveau pixel. F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 31 / 33 Equivalent technique void tracerScene () { g l E n a b l e ( GL STENCIL TEST ) ; // A c t i v e r (MAJ STENCIL , 1 ) : g l S t e n c i l F u n c (GL ALWAYS , 1 , 1 ) ; // t e s t p a s s e t o u j o u r s // n o t e z l a v a l e u r de r e f e r e n c e à 1 p o u r l e REPLACE ! g l S t e n c i l O p ( GL KEEP , GL KEEP , GL REPLACE ) ; TracerPlan ( ) ; // D e s a c t i v e r (MAJ STENCIL ) // p u i s A c t i v e r (TEST STENCIL ) : g l S t e n c i l O p ( GL KEEP , GL KEEP , GL KEEP ) ; g l S t e n c i l F u n c ( GL EQUAL , 1 , 1 ) ; TracerVache ( ) ; // D e s a c t i v e r (TEST STENCIL ) : g l S t e n c i l F u n c (GL ALWAYS , 1 , 1 ) ; // t e s t p a s s e t o u j o u r s // ou d i r e c t e m e n t g l D i s a b l e ( GL STENCIL TEST ) p o u r r e v e n i r // à un t r a c é c o m p l e t e m e n t ”n o r m a l ” } F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 32 / 33 Autre exemple On veut représenter une fenêtre dans un mur. Le but est de voir à travers ce mur. Solution géométrique ? Solution visuelle ? D e s a c t i v e r (MAJ DEPTH ) ; D e s a c t i v e r (MAJ COLOR ) ; A c t i v e r (MAJ STENCIL , 1 ) ; TracerFenetre ( ) ; A c t i v e r (MAJ DEPTH ) ; A c t i v e r (MAJ COLOR ) ; A c t i v e r (TEST STENCIL , ! = 1 ) ; Trac erMur ( ) ; // R é a c t i v e r t r a c é n o r m a l . . . F. Aubert (LS6/MS2) Info Graphique/ V Pipeline pixel : Blending et Stencil 2008-2009 33 / 33