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

Documents pareils