Chapitre IV : Les textures Programmation 3D Fabrice Aubert fabrice.aubert@lifl.fr Licence/Master USTL - 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
Améliorer le réalisme L éclairement est insuffisant : «Texturer»les polygones (murs, sols, peau,...). Inscruster des photos (tableaux, décors de fond,...). Les textures sont primordiales Les textures sont utiles pour de nombreux effets : Eclairement (Lightmap pour le spéculaire, images précalculées,...). Ombres portées (depth-map) Reliefs (bumpmap : textures de normales)... F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 3 / 50
Définition (intuitive) Une texture est une «image», c est à dire une grille de pixels. Les pixels de la texture sont appelés texels (pour les différencier des pixels de l écran graphique). Chaque texel est localisé dans la texture par ses coordonnées s et t. Toute l image de la texture est décrite 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 paramétrisation des textures 3 Aliassage 4 Génération automatique des coordonnées 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 les textures) F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 6 / 50
Application de la texture Consiste à associer à chaque point affiché un texel (donne au point sa couleur). L association se fait simplement en indiquant (ou en calculant) les coordonnées (s, t) du texel voulu. En OpenGL, l association se fait seulement aux sommets. Lors du remplissage des polygones, chaque pixel est associé à un texel par interpolation des coordonnées de textures des sommets (calcul incrémental des coordonnées de texture lors de la rasterization). F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 7 / 50
Méthodes de placage Spécifier «à la main»les coordonnées de textures pour chaque sommet. Instruction gltexcoord2f(s, t). Calculer automatiquement ces coordonnées par projection linéaire (plan mapping) Calculer automatiquement ces coordonnées par projection sphérique (environment mapping) (les deux types de génération automatique sont donnés à 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 é avec c e s c o o r d o n n é 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 ) ; glend ( ) ; F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 9 / 50
Liberté sur les coordonnées 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 ) ; glend ( ) ; F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 10 / 50
Placage libre 2 Répétition 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=c o s ( 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 Liberté totale sur les coordonnées de textures Coordonnées pas toujours évidentes à déterminer Détermination par surface intermédiaire Placage par projection (vu plus loin dans ce cours) F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 13 / 50
3 Initialisation et paramétrisation des textures F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 14 / 50
Création et texture courante Créer de nouveaux identifiants (pour de nouvelles textures) : glgentextures(<nb identifiants a reserver >,<GLuint identifiant>) Exemple : création d un identifiant : GLuint t e x i d ; // e q u i v a l e n t à u n s i g n e d i n t g 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 (association d une image, modification des paramètres, placage, coordonnées de texture,...) s adresseront alors à tex id. F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 15 / 50
Associer une image à une texture Consiste à associer un tableau de texels à 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 à i n t e r p r é t e r par paquet de // t r o i s v a l e u r s c o n s é c u t i v e s width, h e i g h t, // t a i l l e en p i x e l s de l image 0, // 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 é t a t i o n par OpenGL ( image s e r a // s t o c k é 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
Paramétrisation Plusieurs instructions permettent de spécifier des paramètres 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 : décalcomanie (exploite l alpha pour la transparence). GL MODULATE : mixer avec la couleur d éclairement (mélange). Répétition : gltexparameterf(gl TEXTURE 2D,GL TEXTURE WRAP S,GL CLAMP); GL CLAMP : pas de répétition de la texture sur s GL REPEAT : avec répétition sur s F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 17 / 50
Remarques Le tableau image peut être construit à la main, mais généralement provient d un fichier (utilisation de OpenIL dans les tps : http://openil.sourceforge.net/). Contrainte : la taille des images doit être en puissance de 2 (64x128, 16x16,...). Si plusieurs textures : ne pas recharger (glteximage2d) les textures à chaque fois (il suffit d indiquer par glbindtexture l identifiant de la texture 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 désactiver une fois le tracé 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 à l autre lors de la rasterization peut correspondre à un saut de plusieurs texels. 1 Pixel = plusieurs texel (aliassage de réduction, ou minification) = perte d information. F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 21 / 50
Magnification Le passage d un pixel à l autre lors de la rasterization peut correspondre au même texel. 1 Texel = plusieurs pixels (aliassage d agrandissement, ou magnification) = crénelage. F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 22 / 50
Filtrage bilinéaire Pour nuancer ces effets, on peut effectuer la moyenne (pondérée) entre les 4 texels qui sont les plus proches des coordonnées (s, t). Le mélange des couleurs obtenu donne une perception légèrement floue permet de «lisser»la perte d information et les marches d escalier F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 23 / 50
Filtrage bilinéaire 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 s 0 s 1 s 0 λ 2 = t t 0 t 2 t 0 C 1 = λ 1 Couleur 0 + (1 λ 1 )Couleur 1 C 2 = λ 1 Couleur 2 + (1 λ 1 )Couleur 3 C pixel = λ 2 C 1 + (1 λ 2 )C 2 F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 24 / 50
Mip-mapping Stocker plusieurs résolutions d une même texture. Changer de résolution de texture selon le nombre de texels qui correspondent à un pixel (déterminé par les incréments faits sur (s, t)). Permet de nuancer les pertes d informations (filtre d aliassage) si les différentes résolutions 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 résolution par OpenGL (filtre de minimification) : gltexparameterf(gl_texture_2d,gl_texture_min_filter, GL_NEAREST_MIPMAP_NEAREST); Le niveau λ est choisi (à chaque tracé de pixel) pour avoir la meilleure correspondance possible (1 pixel = 1 texel). λ = E(log 2(ds)) où ds est le nombre de texels (dans la direction s) correspondant à 2 pixels consécutifs. F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 27 / 50
Comparaison : filtrage bilinéaire gltexparameterf(gl_texture_2d,gl_texture_min_filter, GL_LINEAR); (image du jeu Quake 3 de Id Software - capture copiée de : http ://kafou.free.fr/filtrage/ ). F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 28 / 50
Comparaison : bilinéaire 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 : trilinéaire gltexparameterf(gl_texture_2d,gl_texture_min_filter, GL_LINEAR_MIPMAP_LINEAR); F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 30 / 50
Trilinéaire 1 Considérer les deux niveaux de mipmap les plus proches (i.e le niveau λ et λ + 1). 2 Faire un filtre bilinéaire pour chacun des deux niveaux en (s, t) C λ, C λ+1 3 Faire une moyenne pondérée entre les deux couleurs obtenues C = (1 k)c λ + kc λ+1 (coefficient donné par k = frac(λ)). F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 31 / 50
5 Génération automatique des coordonnées 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) (génération pour S et T ). Après activation, les gltexcoord ne sont plus interprétés par OpenGL (les coordonnées de texture seront automatiquement calculées en chacun des sommets). Ne pas oublier de désactiver après le tracé par gldisable (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 génération gltexgeni(<gl_s ou GL_T>,GL_TEXTURE_GEN_MODE, <mode de generation>) GL OBJECT LINEAR : linéaire dans le repère objet (plane mapping) GL EYE LINEAR : linéaire dans le repère de l observateur (plane mapping) GL SPHERE MAP : projection sphérique (environment mapping). F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 34 / 50
Plane mapping dans le repère objet Chaque glvertex dont les coordonnées sont (x, y, z, w) (dans le repère local courant) est affecté avec la coordonnée de texture s : s = p 1 x + p 2 y + p 3 z + p 4 w où les coefficients p s = (p 1, p 2, p 3, p 4 ) sont spécifiés par : gltexgenfv(gl S,GL OBJECT PLANE,<float ps[4]>) (idem pour la coordonnée 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 } ; gltexgendv ( GL S, GL OBJECT PLANE, ps ) ; gltexgendv ( GL T, GL OBJECT PLANE, pt ) ; On peut interpréter ps et pt comme un changement de repère par rapport au repère local de l objet. s t.. Texture = M Texture Objet x y z w Objet où M Texture 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 repère 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 } ; gltexgendv ( 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 = ps 1 x + ps 2 y + ps 3 z + ps 4 w Identique à plane mapping dans le repère objet, MAIS : (x, y, z, w) sont les coordonnées du sommet dans le repère de l oeil (GL EYE LINEAR). ps est à interpréter dans le repère courant lors de l appel à gltexgendv(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 dépend principalement de l angle entre la normale N et le vecteur de vue V. Interprétation : reflet sur une bille d acier «plongée»dans un environnement. 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 même temps lors du tracé des polygones (i.e. plusieurs textures courantes simultanément). Chaque texture courante est appelée unité. glactivetexture (GL TEXTUREi) (i = 0, 1,...) : toutes les instructions de textures s adressent alors à l unité numéro i. Par défaut, la GL TEXTURE0 est active. gltexcoord concerne toujours GL_TEXTURE0. Utiliser glmultitexcoord(gl TEXTUREi,...) pour les autres unités. GL TEXTURE0 GL TEXTURE1 GL TEXTURE2 placage des 3 unités F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 44 / 50
Multi-texturing v o i d i n i t ( ) {... glactivetexture (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 é 0 g 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 é 0 ). glactivetexture (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 é 1 g 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 é 1 ). gltexenvf (GL TEXTURE ENV, GL TEXTURE ENV MODE,GL MODULATE ) ; // mode de placage de l unité 1 } } nombreuses solutions de mélange des couleurs entre les textures (cf gltexenv). v o i d t r a c e r C a r r e M u l t i ( ) { glbegin (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); glend ( ) ; } F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 45 / 50
Transformations Toutes les coordonnées (s, t) subissent la matrice de texture courante (matrice identité par défaut). glmatrixmode(gl TEXTURE) : toutes les instructions de matrices (glrotate, gltranslate, glpushmatrix,...) s adresseront à la pile de matrice de texture (de l unité de texture active). Animation de texture (cf TP), contrôle de projection, etc F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 46 / 50
Lightmap LightMap : une source lumineuse peut-être simulée par une texture (projection d un spot, effet spéculaire avec l environment mapping,...). Scène Eclairement gl Texture lightmap (précalculée) Placage lightmap résultat final (source : http ://www.flipcode.net/ ) F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 47 / 50
Billboard BillBoard : objet complexe représenté par un rectangle sur lequel on plaque une photo (arbre, personnage, grille d un portail) rectangle toujours orienté 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 portées notamment). F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 49 / 50
Effets évolués Environment Cube Mapping : calcul de reflexion basé sur le cube (et non une «approximation»de sphere). Texture 3D, Bump-Mapping,... F. Aubert (LS6/MS2) P3D/ IV Les textures 2008-2009 50 / 50