Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
Chapitre IV : Les texturesProgrammation 3D
Fabrice [email protected]
Licence/MasterUSTL - IEEA
2008-2009
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 1 / 50
1 Introduction
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 2 / 50
Ameliorer le realisme
L’eclairement est insuffisant :
« Texturer »les polygones (murs, sols, peau, ...).Inscruster des photos (tableaux, decors de fond,...).⇒ Les textures sont primordiales
Les textures sont utiles pour de nombreux effets :
Eclairement (Lightmap pour le speculaire, images precalculees,...).Ombres portees (depth-map)Reliefs (bumpmap : textures de normales)...
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 3 / 50
Definition (intuitive)
Une texture est une « image », c’est a dire une grille de pixels.Les pixels de la texture sont appeles texels (pour les differencier despixels de l’ecran graphique).Chaque texel est localise dans la texture par ses coordonnees s et t.Toute l’image de la texture est decrite par s ∈ [0, 1] et t ∈ [0, 1]
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 4 / 50
Plan
1 Texturer les objets (ou plaquer les textures)
2 Initialisation et parametrisation des textures
3 Aliassage
4 Generation automatique des coordonnees de texture
5 Pour aller plus loin...
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 5 / 50
2 Texturer les objets (ou plaquer lestextures)
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 6 / 50
Application de la texture
Consiste a associer a chaque point affiche un texel (donne au point sacouleur).
L’association se fait simplement en indiquant (ou en calculant) lescoordonnees (s, t) du texel voulu.
En OpenGL, l’association se fait seulement aux sommets.
Lors du remplissage des polygones, chaque pixel est associe a un texelpar interpolation des coordonnees de textures des sommets (calculincremental des coordonnees de texture lors de la rasterization).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 7 / 50
Methodes de placage
Specifier « a la main »les coordonnees de textures pour chaquesommet.
Instruction glTexCoord2f(s, t).
Calculer automatiquement ces coordonnees par projection lineaire(plan mapping)
Calculer automatiquement ces coordonnees par projection spherique(environment mapping)
(les deux types de generation automatique sont donnes a la fin du cours).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 8 / 50
Avec glTexCoord
g l B e g i n (GL POLYGON ) ;g l T e x C o o r d 2 f ( 0 , 0 ) ; // Le p r o c h a i n sommet s e r a
// a f f e c t e avec c e s c o o r d o n n e e s// de t e x t u r e
g l V e r t e x 3 f v (V0 ) ;g l T e x C o o r d 2 f ( 1 , 0 ) ;g l V e r t e x 3 f (V1 ) ;g l T e x C o o r d 2 f ( 1 , 1 ) ;g l V e r t e x 3 f (V2 ) ;g l T e x C o o r d 2 f ( 0 , 1 ) ;g l V e r t e x 3 f (V3 ) ;
g lEnd ( ) ;
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 9 / 50
Liberte sur les coordonnees de texture
g l B e g i n (GL POLYGON ) ;g l T e x C o o r d 2 f ( 0 . 5 , 0 . 2 ) ;g l V e r t e x 3 f (V0 ) ;g l T e x C o o r d 2 f ( 1 , 0 . 3 ) ;g l V e r t e x 3 f (V1 ) ;g l T e x C o o r d 2 f ( 0 . 8 , 0 . 8 ) ;g l V e r t e x 3 f (V2 ) ;g l T e x C o o r d 2 f ( 0 . 5 , 1 ) ;g l V e r t e x 3 f (V3 ) ;
g lEnd ( ) ;
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 10 / 50
Placage libre 2
⇒ Repetition de la texture
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 11 / 50
Autre exemple
i n t n b p a r a l l e l e =20;double p a s a n g l e =3.14159/( f l o a t ) n b p a r a l l e l e ;double a n g l e =0.0 ;g l B e g i n ( GL QUAD STRIP ) ;f o r ( i n t i =0; i<n b p a r a l l e l e ; i ++) {
double x , z ;x=cos ( a n g l e ) ;z=s i n ( a n g l e ) ;g l T e x C o o r d 2 f ( a n g l e / 6 . 2 4 , 0 ) ;g l V e r t e x 3 f ( x ,−2 , z ) ;g l T e x C o o r d 2 f ( a n g l e / 6 . 2 4 , 1 ) ;g l V e r t e x 3 f ( x , 2 , z ) ;a n g l e+=p a s a n g l e ;
}glEnd ( ) ;
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 12 / 50
Remarques
Liberte totale sur les coordonnees de textures
Coordonnees pas toujours evidentes a determiner
⇒ Determination par surface intermediaire⇒ Placage par projection (vu plus loin dans ce cours)
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 13 / 50
3 Initialisation et parametrisation destextures
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 14 / 50
Creation et texture courante
Creer de nouveaux identifiants (pour de nouvelles textures) :glGenTextures(<nb identifiants a reserver>,<GLuint ∗ identifiant>)
Exemple : creation d’un identifiant :
GLuint t e x i d ; // e q u i v a l e n t a u n s i g n e d i n tg l G e n T e x t u r e s (1 ,& t e x i d )
Indiquer la texture courante par son identifiant :glBindTexture(GL TEXTURE 2D,tex id)
⇒ Toutes les instructions concernant les textures 2D (associationd’une image, modification des parametres, placage, coordonnees detexture,...) s’adresseront alors a tex id .
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 15 / 50
Associer une image a une texture
Consiste a associer un tableau de texels a l’identifiant courant.
// format memoire des mots e t t a b l e a u x ( t e c h n i q u e . . . )g l P i x e l S t o r e i (GL UNPACK ALIGNMENT , 1 ) ;// i n s t r u c t i o n d ’ a s s o c i a t i o n au t a b l e a u image (9 p a r a m e t r e s )glTexImage2D (
GL TEXTURE 2D , // t e x t u r e 2D (= image )0 , // n i v e a u de mipmap ( vu p l u s l o i n )3 , // l e t a b l e a u e s t a i n t e r p r e t e r par ”paquet ” de
// t r o i s v a l e u r s c o n s e c u t i v e swidth , h e i g h t , // t a i l l e en p i x e l s de l ’ image0 , // g e s t i o n des b o r d s pour r e c o l l e m e n t
// ( dans ce c o u r s = 0)GL RGB , // i n t e r p r e t a t i o n par OpenGL ( image s e r a
// s t o c k e e en v a l e u r s de Rouge , Vert , Bleu )GL UNSIGNED BYTE , // format du t a b l e a u ( i c i u n s i g n e d b y t e )image ) ; // l ’ image ( t a b l e a u c o n t e n a n t l e s t e x e l s ) .
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 16 / 50
Parametrisation
Plusieurs instructions permettent de specifier des parametres de« placage »Exemples :
Calcul du fragment destination :glTexEnvf(GL TEXTURE ENV,GL TEXTURE ENV MODE,GL DECAL);
GL REPLACE : la couleur est la couleur du texel.GL DECAL : decalcomanie (exploite l’alpha pour la transparence).GL MODULATE : mixer avec la couleur d’eclairement (melange).
Repetition :glTexParameterf(GL TEXTURE 2D,GL TEXTURE WRAP S,GL CLAMP);
GL CLAMP : pas de repetition de la texture sur sGL REPEAT : avec repetition sur s
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 17 / 50
Remarques
Le tableau image peut etre construit a la main, mais generalementprovient d’un fichier (utilisation de OpenIL dans les tps :http://openil.sourceforge.net/).
Contrainte : la taille des images doit etre en puissance de 2 (64x128,16x16, ...).
Si plusieurs textures : ne pas recharger (glTexImage2D) les textures achaque fois (il suffit d’indiquer par glBindTexture l’identifiant de latexture qu’on veut appliquer).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 18 / 50
Appliquer une texture
Lorsqu’on veut appliquer (plaquer) la texture d’identifiant tex id :
g l B i n d T e x t u r e (GL TEXTURE 2D , t e x i d ) ;g l E n a b l e (GL TEXTURE 2D ) ;
Ne pas oublier de desactiver une fois le trace fait :glDisable (GL TEXTURE 2D);
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 19 / 50
4 Aliassage
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 20 / 50
Minification
Le passage d’un pixel a l’autre lors de la rasterization peut correspondre aun saut de plusieurs texels.
1 Pixel = plusieurs texel (aliassage de reduction, ou minification) =perte d’information.
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 21 / 50
Magnification
Le passage d’un pixel a l’autre lors de la rasterization peut correspondre aumeme texel.
1 Texel = plusieurs pixels (aliassage d’agrandissement, oumagnification) = crenelage.
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 22 / 50
Filtrage bilineaire
Pour nuancer ces effets, on peut effectuer la moyenne (ponderee)entre les 4 texels qui sont les plus proches des coordonnees (s, t).
Le melange des couleurs obtenu donne une perception legerementfloue ⇒ permet de « lisser »la perte d’information et les marchesd’escalier
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 23 / 50
Filtrage bilineaire
g l T e x P a r a m e t e r i (GL TEXTURE 2D,<GL TEXTURE MIN ou GL TEXTURE MAG>,<GL LINEAR ou GL NEAREST>)
λ1 = s−s0s1−s0
λ2 = t−t0t2−t0
C1 = λ1Couleur0 + (1− λ1)Couleur1
C2 = λ1Couleur2 + (1− λ1)Couleur3
Cpixel = λ2C1 + (1− λ2)C2
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 24 / 50
Mip-mapping
Stocker plusieurs resolutions d’une meme texture.
Changer de resolution de texture selon le nombre de texels quicorrespondent a un pixel (determine par les increments faits sur(s, t)).
Permet de nuancer les pertes d’informations (filtre d’aliassage) si lesdifferentes resolutions sont construites par moyennage.
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 25 / 50
Comparaison
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 26 / 50
Activation MipMap
Chargement totalement libre :
glTexImage2D(GL_TEXTURE_2D,<NIVEAU MIPMAP>,...,image);
Construction automatique avec moyennage :
gluBuild2DMipmaps(GL_TEXTURE_2D,3, width,height,
GL_RGB,GL_UNSIGNED_BYTE, image);
Choix du niveau de resolution par OpenGL (filtre de minimification) :
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
GL_NEAREST_MIPMAP_NEAREST);
⇒ Le niveau λ est choisi (a chaque trace de pixel) pour avoir la meilleurecorrespondance possible (1 pixel = 1 texel).
λ = E(log2(ds)) ou ds est le nombre de texels (dans la direction s) correspondant a 2
pixels consecutifs.
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 27 / 50
Comparaison : filtrage bilineaire
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
(image du jeu Quake 3 de Id Software - capture copiee de :http ://kafou.free.fr/filtrage/ ).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 28 / 50
Comparaison : bilineaire avec MipMap
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 29 / 50
Comparaison : trilineaire
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 30 / 50
Trilineaire
1 Considerer les deux niveaux de mipmap les plus proches (i.e le niveauλ et λ+ 1).
2 Faire un filtre bilineaire pour chacun des deux niveaux en(s, t)⇒ Cλ,Cλ+1
3 Faire une moyenne ponderee entre les deux couleurs obtenues⇒ C = (1− k)Cλ + kCλ+1 (coefficient donne par k = frac(λ)).
⇒ Passage « lisse »entre les differents niveaux de mipmapF. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 31 / 50
5 Generation automatique descoordonnees de texture
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 32 / 50
Activation
glEnable(GL TEXTURE GEN S) et glEnable(GL TEXTURE GEN T) (generationpour S et T ).
Apres activation, les glTexCoord ne sont plus interpretes par OpenGL(les coordonnees de texture seront automatiquement calculees enchacun des sommets).
Ne pas oublier de desactiver apres le trace parglDisable (GL TEXTURE GEN S) et glDisable (GL TEXTURE GEN T)
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 33 / 50
Trois modes de generation
glTexGeni(<GL_S ou GL_T>,GL_TEXTURE_GEN_MODE,<mode de generation>)
GL OBJECT LINEAR : lineaire dans le repere objet (plane mapping)
GL EYE LINEAR : lineaire dans le repere de l’observateur (planemapping)
GL SPHERE MAP : projection spherique (environment mapping).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 34 / 50
Plane mapping dans le repere objet
Chaque glVertex dont les coordonnees sont (x , y , z ,w) (dans le reperelocal courant) est affecte avec la coordonnee de texture s :
s = p1x + p2y + p3z + p4w
ou les coefficients ps = (p1, p2, p3, p4) sont specifies par :glTexGenfv(GL S,GL OBJECT PLANE,<float ps[4]>)
(idem pour la coordonnee T avec GL T).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 35 / 50
Exemple
double ps [ 4 ] = { 0 . 5 , 0 . 5 , 0 . 0 , 0 . 2 } ;double pt [ 4 ] ={ −1 . 0 , 1 . 0 , 0 . 0 , 0 . 0} ;g lTexGendv ( GL S , GL OBJECT PLANE , ps ) ;glTexGendv ( GL T , GL OBJECT PLANE , pt ) ;
On peut interpreter ps et pt comme un changement de reperepar rapport au repere local de l’objet.
st..
Texture
= MTexture→Objet
xyzw
Objet
ou MTexture→Objet =
ps[0] ps[1] ps[2] ps[3]pt[0] pt[1] pt[2] pt[3]
. . . .
. . . .
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 36 / 50
Plane mapping dans le repere eye
g l B i n d T e x t u r e (GL TEXTURE 2D , t e x i d ) ;
g l T e x G e n i ( GL S , GL TEXTURE GEN MODE , GL EYE LINEAR ) ;g l E n a b l e (GL TEXTURE GEN S ) ;g l T e x G e n i ( GL T , GL TEXTURE GEN MODE , GL EYE LINEAR ) ;g l E n a b l e (GL TEXTURE GEN T ) ;
double ps [ 4 ] ={1 , 0 , 0 . 0 , 0} ;double pt [ 4 ] = { 0 . 0 , 1 . 0 , 0 . 0 , 0 . 0 } ;g lTexGendv ( GL S , GL EYE PLANE , ps ) ;glTexGendv ( GL T , GL EYE PLANE , pt ) ;
⇒ GL EYE LINEAR remplace GL OBJECT LINEAR
⇒ GL EYE PLANE remplace GL OBJECT PLANE
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 37 / 50
Calcul
s = ps1x + ps2y + ps3z + ps4w
Identique a plane mapping dans le repere objet, MAIS :
(x , y , z ,w) sont les coordonnees du sommet dans le repere de l’oeil(GL EYE LINEAR).
ps est a interpreter dans le repere courant lors de l’appel aglTexGendv(GL S,GL EYE PLANE,ps); ( !).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 38 / 50
Exemple
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 39 / 50
Environment mapping
g l B i n d T e x t u r e (GL TEXTURE 2D , t e x i d ) ;
g l T e x G e n i ( GL S , GL TEXTURE GEN MODE , GL SPHERE MAP ) ;g l E n a b l e (GL TEXTURE GEN S ) ;
g l T e x G e n i ( GL T , GL TEXTURE GEN MODE , GL SPHERE MAP ) ;g l E n a b l e (GL TEXTURE GEN T ) ;
Le calcul au sommet depend principalement de l’angle entre lanormale N et le vecteur de vue V .
Interpretation : reflet sur une bille d’acier « plongee »dans unenvironnement.
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 40 / 50
Exemple
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 41 / 50
Cartoon shading (simple)
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 42 / 50
6 Pour aller plus loin...
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 43 / 50
Multi-texturing
Appliquer plusieurs textures en meme temps lors du trace des polygones (i.e. plusieurstextures courantes simultanement). Chaque texture courante est appelee unite.
glActiveTexture (GL TEXTUREi) (i = 0, 1, ...) : toutes les instructions de texturess’adressent alors a l’unite numero i .
Par defaut, la GL TEXTURE0 est active.
glTexCoord concerne toujours GL_TEXTURE0. Utiliser glMultiTexCoord(GL TEXTUREi,...)pour les autres unites.
GL TEXTURE0 GL TEXTURE1 GL TEXTURE2 placage des 3 unites
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 44 / 50
Multi-texturing
v o i d i n i t ( ) {. . .g l A c t i v e T e x t u r e (GL TEXTURE0 ) ;g l B i n d T e x t u r e (GL TEXTURE 2D , i d t e x 1 ) ; // i d t e x 1 e s t l a t e x t u r e c o u r a n t e POUR l ’ u n i t e 0g l E n a b l e (GL TEXTURE 2D ) ; // a c t i v a t i o n p l a c a g e ( de l ’ u n i t e 0 ) .g l A c t i v e T e x t u r e (GL TEXTURE1 ) ;g l B i n d T e x t u r e (GL TEXTURE 2D , i d t e x 2 ) ; // i d t e x 2 e s t l a t e x t u r e c o u r a n t e POUR l ’ u n i t e 1g l E n a b l e (GL TEXTURE 2D ) ; // a c t i v a t i o n p l a c a g e ( de l ’ u n i t e 1 ) .g l TexE nvf (GL TEXTURE ENV , GL TEXTURE ENV MODE ,GL MODULATE ) ; // mode de p l a c a g e de l ’ u n i t e 1
}}
⇒ nombreuses solutions de melange des couleurs entre les textures (cfglTexEnv).
v o i d t r a c e r C a r r e M u l t i ( ) {g l B e g i n (GL QUADS ) ;
g l M u l t i T e x C o o r d 2 f (GL TEXTURE0 , 0 , 0 ) ;g l M u l t i T e x C o o r d 2 f (GL TEXTURE1 , 0 , 0 ) ;g l V e r t e x 3 f (−1 ,−1 ,0);g l M u l t i T e x C o o r d 2 f (GL TEXTURE0 , 1 , 0 ) ;g l M u l t i T e x C o o r d 2 f (GL TEXTURE1 , 1 , 0 ) ;g l V e r t e x 3 f (1 ,−1 ,0) ;g l M u l t i T e x C o o r d 2 f (GL TEXTURE0 , 1 , 1 ) ;g l M u l t i T e x C o o r d 2 f (GL TEXTURE1 , 1 , 1 ) ;g l V e r t e x 3 f ( 1 , 1 , 0 ) ;g l M u l t i T e x C o o r d 2 f (GL TEXTURE0 , 0 , 1 ) ;g l M u l t i T e x C o o r d 2 f (GL TEXTURE1 , 0 , 1 ) ;g l V e r t e x 3 f (−1 ,1 ,0) ;g lEnd ( ) ;
}F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 45 / 50
Transformations
Toutes les coordonnees (s, t) subissent la matrice de texture courante(matrice identite par defaut).
glMatrixMode(GL TEXTURE) : toutes les instructions de matrices (glRotate,glTranslate , glPushMatrix,...) s’adresseront a la pile de matrice de texture(de l’unite de texture active).
⇒ Animation de texture (cf TP), controle de projection, etc
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 46 / 50
Lightmap
LightMap : une source lumineuse peut-etre simulee par une texture(projection d’un spot, effet speculaire avec l’environment mapping,...).
Scene Eclairement gl Texture lightmap (precalculee)
Placage lightmap resultat final
(source : http ://www.flipcode.net/ )F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 47 / 50
Billboard
BillBoard : objet complexe represente par un rectangle sur lequel onplaque une photo (arbre, personnage, grille d’un portail) ⇒ rectangletoujours oriente vers l’observateur, et utilisation de la transparence.
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 48 / 50
Depth map
DepthMapping : texture de profondeur (pour les ombres porteesnotamment).
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 49 / 50
Effets evolues
Environment Cube Mapping : calcul de reflexion base sur le cube (etnon une « approximation »de sphere).
Texture 3D, Bump-Mapping, ..........
F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 50 / 50