Chapitre IV : Les textures - Programmation 3Daubert/p3d/Cours04.pdf · 3 Faire une moyenne pond er...

Preview:

Citation preview

Chapitre IV : Les texturesProgrammation 3D

Fabrice Aubertfabrice.aubert@lifl.fr

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

Recommended