CM4 - Serveur pédagogique UFR Sciences et Techniques
Transcription
CM4 - Serveur pédagogique UFR Sciences et Techniques
22/09/16 SYNTHÈSE D’IMAGE L3 TEXTURES Sandrine LANQUETIN Bureau G208 [email protected] D’après les cours de M. Neveu du LE2I et de J. Thollot de l’IMAG 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 3 Modèle géométrique 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 4 Illumination locale Objet = liste de points munis de normales + groupement en faces 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Introduction • Détails complexes sur une surface • Augmenter le nombre de polygones • Pb : augmentation complexité modélisation et rendu • Alternative : utilisation de texture 2D ou 3D 5 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 6 Modélisation de la « matière » Ajout d’attributs (couleur, transparence…) en chaque point Problème : Ne pas tout modéliser à l’échelle de la géométrie ! On veut garder une seule face, mais plusieurs couleurs 1 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 7 Les textures 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 8 Modélisation de la « matière » Ajout d’attributs (couleur, transparence…) en chaque point Problème : Ne pas tout modéliser à l’échelle de la géométrie ! Des micropolygones seraient nécessaires 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 9 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 10 Les textures Les textures Font varier la matière à l’intérieur de chaque face • • Ajout d'information visuelle à petit prix Support hardware • interpolation des coordonnées de texture • interpolation des valeurs de couleur • filtrage multi-résolution (mip-mapping) X Texture de couleurs 22/09/16 = Texture de normales S. Lanquetin – L3 Info, Synthèse d’images 11 TEXTURES Gain de réalisme Pas « cher » TEXTURES 2D Attacher la texture à l’objet ó travailler dans l’espace de l’objet 2 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 13 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Est-ce simple ? Est-ce simple ? • Idée simple • coller une image sur une surface • Idée simple • coller une image sur une surface image 2D image 2D surface 3D 22/09/16 14 S. Lanquetin – L3 Info, Synthèse d’images surface 3D 15 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 16 Placage de Texture Texture mapping Est-ce simple ? • Idée simple • coller une image sur une surface • 3 ou 4 systèmes de coordonnées projection-1 mapping-1 projection mapping v u image 2D Espace image Espace objet Espace texture pixel de l’image surface 3D Texel de la texture surface 3D 22/09/16 Texel S. Lanquetin – L3 Info, Synthèse d’images → 17 Pixel + tous les texels sont traités dans l’ordre 22/09/16 Pixel S. Lanquetin – L3 Info, Synthèse d’images → 18 Texel + seulement les pixels visibles sont traités +traitement pixel par pixel - A(texel) < pixel. calcul de la proportion du pixel couvert - plus complexe :l - plus simple, mais la contribution de tout texel caché est calculée inutilement Calcul de la projection inverse du pixel dans l’espace objet, puis des coordonnées correspondantes dans l’espace texture 3 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 19 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 20 Principe Les textures 2D • Image plane I (s,t) Coordonnées paramétriques • Fonction de plaquage (mapping) A : P(x,y,z) è (s,t) • Modèle 3D : points ou faces, normales, coordonnées de texture (s,t) S A A Projection T P A(S-1) Coordonnées de texture t s 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 21 S connue Coordonnées de l’objet 22/09/16 Coordonnées de l’écran S. Lanquetin – L3 Info, Synthèse d’images 22 Déformation L'espace paramétrique de la sphère recouvre complètement l'espace de la texture (a)La texture déformée sphère. Image de l'espace des paramètres de l'objet (gras) dans l'espace de la texture (grisé) Déformation de la texture pour l’adapter à la paramétrisation de la surface. On utilise une texture déformée (respectant le facteur d’échelle 2 :1) transformation l = 2.h et θ= π/4 (qui implique h = V2/3). 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Textures cycliques (b) Application sur la 23 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 24 Grande surface à texturer • Feuille papier peint assez grande pour recouvrir toute la surface • Or (s,t) dans [0,1]² • Mais pas (u,v) • Structure périodique Utilisation d’une texture naturelle. (a) Texture de bois. (b) Sphère en bois (c) Et de l’autre côté de la sphère ? (d) Paramétrisation multiple. 4 22/09/16 22/09/16 25 S. Lanquetin – L3 Info, Synthèse d’images 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 26 Répétition Répétition avec ε ⎧ u= mod(u',1/n ) ⎪ u ε: ⎨ v=mod(v',1/n ) ⎪⎩ v 22/09/16 27 S. Lanquetin – L3 Info, Synthèse d’images Répétition Miroir 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 28 Exemple de répétition Calculer (u,v) pour (u’,v’)=(2/3,1/2) ⎧ ⎛ 1 ⎞ ⎛ 2 1⎞ 1 ⎪u = mod⎜⎜ u ' , ⎟⎟ = mod⎜ , ⎟= nu ⎠ ⎪ ⎝ 3 5⎠ 3 ⎝ ⎨ ⎛ ⎞ 1 ⎪ v = mod⎜ v' , ⎟ = mod⎛ 1 , 1 ⎞= 1 ⎜ ⎟ ⎜ n ⎟ 2 ⎪ ⎝ 2 3⎠ 2 v ⎠ ⎝ ⎩ 10 1 2 5 3 = × = = 3.3333 = 3 + 1 3 3 1 3 1 5 2 = 3 = 1.5 = 1 + 1 1 2 2 3 ⎧ ⎧mod(u',1/n u ) si ⎢⎣ u'.n u ⎥⎦ estpair ⎪u = ⎨ ⎪ ⎩1-mod(u',1/n u ) sinon ε :⎨ ⎧mod(v',1/n v ) si ⎢⎣ v'.n v ⎥⎦ estpair ⎪ ⎪ v = ⎨1-mod(v',1/n ) sinon v ⎩ ⎩ 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 29 Exemple de répétition miroir ⎧ ⎧mod(u',1/n u ) si ⎣⎢ u'.n u ⎦⎥ estpair 1 ⎪u = ⎨ = 1− ⎪ ⎩1-mod(u',1/n u ) sinon 3 ε :⎨ ⎧mod(v',1/n v ) si ⎢⎣ v'.n v ⎥⎦ estpair 1 ⎪ = 1− ⎪ v = ⎨1-mod(v',1/n ) sinon v ⎩ ⎩ 2 10 S. Lanquetin – L3 Info, Synthèse d’images 30 Cas complexes Calculer (u,v) pour (u’,v’)=(2/3,1/2) ⎢ ⎥ ⎢ ⎥ ⎣u'.nu ⎦ = ⎢ 3 × 5⎥ = ⎢ 3 ⎥ = ⎣3.3333⎦ ⎣ ⎦ ⎣ ⎦ 22/09/16 2 = 3 1 = 2 2 =3 • Quand S non connue • Application intermédiaire • Projection 5 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 31 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 32 S. Lanquetin – L3 Info, Synthèse d’images 34 Application A 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 33 Projection selon un axe 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Projection sphérique 22/09/16 Projection cylindrique 35 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 36 Projection par Développement 6 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 37 Projection par Développement 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 38 Effets différent selon le mapping • Quel (x,y,z) on considère ? 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 39 Surfaces complexes : application intermédiaire Position relative à l’englobant 22/09/16 Problèmes S. Lanquetin – L3 Info, Synthèse d’images 40 Composition application intermédiaire projection Vecteur normal à la surface (exagère les déformations) Vecteur réfléchi (environnement mapping) Centre 22/09/16 Vecteur normal à la surface intermédiaire (atténue les déformations) S. Lanquetin – L3 Info, Synthèse d’images 41 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 42 Problèmes • Aliassage • Plaquer une texture sans distorsion • Synthétiser une texture par l’exemple • Synthétiser/plaquer sur une surface directement 7 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 43 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 44 Problèmes d’aliassage Que se passe-t-il ? - Devant, on voit les pixels - Au fond • Plusieurs couleurs à afficher dans un pixel – On aimerait une moyenne ! • Fréquences parasites : les « alias » 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 45 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 46 Problèmes d’échelle Ecran At<Ap - Devant, on voit les pixels Objet A t ≈ Ap Texture At >Ap - Au fond • Plusieurs couleurs à afficher dans un pixel – On aimerait une moyenne ! • Fréquences parasites : les « alias » 22/09/16 Ecran S. Lanquetin – L3 Info, Synthèse d’images Petite échelle 47 22/09/16 Grande échelle S. Lanquetin – L3 Info, Synthèse d’images 48 Texture 8 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 49 Même taille 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 50 S. Lanquetin – L3 Info, Synthèse d’images 52 Texels < Pixels S. Lanquetin – L3 Info, Synthèse d’images 51 22/09/16 Facteur de compression d Texels > Pixels Pij : pixel Puv : polygone correspondant dans l’espace texture d = Α ( Puv ) Ex : d = 1 : le pixel couvre tt l’espace texture d = ¼ : le pixel couvre ¼ de l’espace texture Taille image texture = 2N x 2N => aire d’un texel At = 2-N x 2-N Facteur de compression d’un pixel : dt = Α t = 2− N Si d<dt alors pixellisation Si d>dt alors aliasing 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Pixellisation 53 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 54 Pixellisation (uc,vc) : image du centre de Pij Dans l’image Tij, (n.uc,n.vc) est dans [i’,i’+1]x[j’,j’+1] avec i’=n.uc et j’=n.vc Interpolation bilinéaire Interpolation bicubique Interpolation pour lutter contre la pixellisation. De gauche à droite sur chaque exemple : image pixellisée, interpolation bilinéaire, interpolation bicubique. 9 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 55 Solution 1 : calcul à haute résolution 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 56 Solution 2 : Mip-Mapping 57 Sous échantillonnage (aliasing) 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 58 Mip-Mapping Mip-Mapping : texture à plusieurs échelles • Ensemble des images pré-calculées pour le mip-mapping. On suppose l’image de la texture carrée et de taille 2N × 2N. Changement de résolution le plus simple : construire une image deux fois plus petite. A chaque pixel de l’image deux fois plus petite, on associe un bloc de 2×2 pixels sur l’image originale de valeur = moyenne des 4 pixels du bloc. Ti,kj−1 = 1 k k k k (T + T2i+1,2 + T2i,2 + T2i+1,2 ) j j +1 j +1 4 2i,2k j Ti, j La taille de l’image est 2k × 2k. N A partir de l’image T on construit un ensemble de N + 1 images T k , k de 0 à N Facteur de compression au niveau k : dk = 2-k 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 59 Mip-Mapping 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Mip mapping : couleur d’un pixel • Stockage optimal du mipmap d’une texture couleur (de la Pixel courant (uc,vc,d) figure précédente) en mémoire. R G R G B B R G B R G B MIP = Multum In Parvo (beaucoup de chose en peu de place) 60 kc = -log2(d) Voisin le plus proche InterpolationBilinéaire ( C (uc , vc ) = Ti k', 'j ' k ' = [kc ],(i ', j ') = ⎣⎡uc .2k ' ⎦⎤ , ⎣⎡vc .2k ' ⎦⎤ C ( uc ,vc ) = Ck' ( u',v' ) Ck' ( u,v ) = [1 − u Interpolation trilinéaire ) k' = [ kc ] ,( u',v' ) = ( uc − [uc ] ,vc − [vc ]) k' u ] ⎡Ti',j' ⎢ k' ⎢⎣Ti'+1,j' ⎡1 − v ⎤ k' ⎤⎢ Ti',j' +1 ⎥ ⎥⎣ v ⎦ Ti'k'+1,j'+1 ⎥⎦ C (uc , vc ) = (1 − λ )Ck ' (u ', v ') + λCk '+1 (u ', v ') kc = (1 − λ )k '+ λ (k '+ 1) k ', (u ', v '), Ck ' (u, v) comme bilinéaire 10 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 61 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 62 Textures de normales Technique du mipmapping appliqué à l’échiquier bilinéaire 22/09/16 (bump mapping) trilinéaire S. Lanquetin – L3 Info, Synthèse d’images 63 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 64 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 66 Perturbation des normales Donnée par une texture de normale (normal map) 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Perturbation des normales Donnée par une texture de relief (bump map) 65 Bump Mapping/ Displacement Mapping Carte de hauteurs Modification des normales 11 22/09/16 22/09/16 67 S. Lanquetin – L3 Info, Synthèse d’images t Espace Texture (1, 1) (0, 0) 68 on associe à chaque sommet (P0, P1, P2) d’une facette des coordonnées (Q0,Q1,Q2) dans l’espace des textures Espace Objet (s, t) = (0.2, 0.8) •A a• b• S. Lanquetin – L3 Info, Synthèse d’images Cas des facettes Cas des facettes (0, 1) 22/09/16 •c (0.4, 0.2) • B s (1, 0) C • (0.8, 0.4) Si P = (1 - α - β).P0 + α.P1 + β.P2 alors Q = (1 - α - β).Q0 + α.Q1 + β.Q2 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 69 Cas des facettes 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 70 Intérêt du placage de texture Si on utilise une interpolation similaire à l’ombrage de Gouraud (accélération texturage) ie si P' dans l’espace de l’écran est défini par : P’ = (1 – α’ – β’).P’0 + α’.P’1+ β’.P’2 Et qu’on calcule Q = (1 – α’ – β’).Q0 + α’.Q1 + β’.Q2 alors erreur projective • Réduction de la complexité géométrique • Résultat naturel lors de transformations il faut : Q= Q0 Q Q +α 1 + β 2 w0 w1 w2 (1 − α − β ) / w0 + α / w1 + β / w2 (1 − α − β ) wi coord . hom. de Pi • Simulation des matériaux naturels, des phénomènes naturels ou optiques • Facile, pas cher 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 72 Introduction • Couleur • Dégradé de couleur TEXTURES OPENGL • Sans texture : bcp de polygones • Réalisme (moins régulier, perspective…) 12 22/09/16 22/09/16 S.Lanquetin – L3 Info, Synthèse d’images 73 Introduction 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 74 Texture • Appliquer une image 1D, 2D ou 3D sur des primitives géométriques • 2D plus intuitive • Les coordonnées de texture sont (s,t,r,q) • Répétition de la texture dans 1, 2 ou 3 directions • Application automatique de texture • Réfléchissement de l’environnement sur les objets brillants • Fusion couleur / Texture 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 75 Principe de base du placage de texture 2D Un texel est un couple (s,t) de coordonnées dans [0,1]* [0,1] identifiant un point de la texture 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 76 Qu’est ce qu’une texture • Texture : Tableau de données • Ex. Couleur, luminance, alpha, normal… • Texel : 1 élément du tableau • coordonnées de texture sont (s,t,r,q) • Texture 2D (s,t) Problème : comment trouver le(s) texel(s) correspondant à un fragment xs, ys ? Solution : couples sommet/texel et interpolation 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 77 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Placage de texture Les textures en OpenGL • Comment construire une texture • Etapes du placage de texture • Spécifier une texture • Activer le placage de texture • Préciser comment la texture est appliquée sur les objets • Dessiner la scène • Quelle texture pour un texel ? • Objet texture • Comment lier le pixel aux texels ? • Coordonnées de texture 78 • Quelle interaction entre texture et pixel ? • Remplacement, Mélange, Modulation • Pixel plaqué sur plusieurs texels ? L’inverse ? • Aliassage : Augmentation et réduction 13 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 79 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Les textures en OpenGL Exemple de création de texture Préparation: • Génération d’une image qui sera utilisée comme texture • Préparer l’image comme un gros morceau de mémoire • La générer ou la charger (librairies) 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 81 80 // l’image damier. static GLubyte checkImage0[256][256][4]; // Générer une image damier avec du code void makeCheckImage(void) { GLubyte c; for(int i=0; i<256; i++) for(int j=0; j<256; j++) { c = ((((i&0x20)==0)^((j&0x20))==0))*255; checkImage0[i][j][0] = checkImage0[i][j][1] = checkImage0[i][j][2] = c; checkImage0[i][j][3] = 255; } } 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 82 Les textures en OpenGL Définir une image comme Texture Préparation: glTexImage2D( target, level, components, w, h, border, format, type, texels ); • Préparer l’image comme un gros morceau de mémoire • La générer ou la charger (librairies) • Créer une texture à partir d’une image • Quelles informations conserver en mémoire ? • RGB? RGBA? • Hauteur/Largeur • Format de données? • float? unsigned int? 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 83 target: type de texture, e.g. GL_TEXTURE_2D level: nombre de résolutions utilisées pour le mipmapping//0 components: éléments par texel //1 à 4 w, h: largeur et hauteur des texels en pixels//2^n border: largeur de la bordure//0 ou 1 format and type: description des texels//GL_RGBA texels: pointeur sur le tableau de texels glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Les textures en OpenGL Les textures en OpenGL • Rendu • Coordonnées de texture Mise en place: • Associe à chaque sommet des coordonnées de texture Ou • Laisse OpenGL générer des coordonnées de texture 84 • Activer les fonctionnalités de texture • Activé ou Désactivé • glEnable(GL_TEXTURE_2D) • Spécifier comment appliquer la texture sur les pixels • Remplace/Mélange/Module/Décale • glTexEnv(…) • Autres paramètres • filtres 14 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 85 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 86 Exemple de Texture Spécifier une texture image void GL_init(void) { makeCheckImage(); // spécifier la texture avec l’image (pointeur sur le dernier param) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage0); // Comment la texture interagit avec la couleur du pixel glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); // filtres glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Activation du placage de texture 2D glEnable(GL_TEXTURE_2D); } • Définir une texture à partir d’un tableau de 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 87 Coordonnées de texture Glubyte texture[512][512][3]; • Définir à partir d'une autre texture • copie • code • Activer l’application de texture • glEnable(GL_TEXTURE_2D) • OpenGL supporte des cartes de texture de dimension 1 à4 texture 1,1 • glTexCoord{1234}{sifd}(coords) spécifié pour chaque sommet 0, 1 1,0 Espace Texture Attention aux distorsions si les ratios sont différents. Pour éviter cela, prendre une portion de texture S. Lanquetin – L3 Info, Synthèse d’images 89 (s, t) = (0.2, 0.8) A a 0, 0 22/09/16 Espace Objet 1, 1 b 22/09/16 88 • À partir des coordonnées paramétriques de la t 0,0 S. Lanquetin – L3 Info, Synthèse d’images Appliquer une Texture Comment déterminer les coordonnées texture ? 0,1 texels (texture elements) c (0.4, 0.2) B C (0.8, 0.4) 1, 0 s S. Lanquetin – L3 Info, Synthèse d’images 90 Coord texture Exemple de dessin d'un carré texturé • Texture carrée et objet carré • Application des coord de text sur les coord géom glEnable(GL_TEXTURE_2D) ; glBegin(GL_QUADS) ; glTexCoord2f(0,0) ; glVertex2f(x1,y1) ; glTexCoord2f(1,0) ; glVertex2f(x2,y1) ; glTexCoord2f(1,1) ; glVertex2f(x2,y2) ; glTexCoord2f(0,1) ; glVertex2f(x1,y2) ; glEnd() ; t 0, 1 0, 0 1, 1 1, 0s x1,y2 0,1 x2,y2 1,1 x1,y1 0,0 x2,y1 1,0 15 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 91 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 92 Attention ! Attention ! Pour OpenGL, origine image bas gauche Souvent origine image haut gauche 0,1 x1,y2 1,0 0,0 1,1 x2,y2 Pour OpenGL, origine image bas gauche Souvent origine image haut gauche 0,0 x1,y2 1,0 0,0 1,0 x2,y2 x1,y1 Objet 0,0 x2,y1 1,0 x1,y1 Objet 0,1 x2,y1 1,1 0,1 Texture 1,1 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 0,1 93 Coord texture 22/09/16 Texture 1,1 S. Lanquetin – L3 Info, Synthèse d’images Exemple de dessin d'un carré texturé • Texture carrée et mur l*2l/3 • Application des coord de text des 2/3 inf de la texture sur les coord géom du mur t glEnable(GL_TEXTURE_2D) ; 0, 1 glBegin(GL_QUADS) ; glTexCoord2f(0,0) ; glVertex2f(x1,y1) ; glTexCoord2f(1,0) ; 0, 0 glVertex2f(x2,y1) ; glTexCoord2f(1,2/3) ; glVertex2f(x2,y2) ; x1,y2 0,2/3 glTexCoord2f(0,2/3) ; glVertex2f(x1,y2) ; glEnd() ; x1,y1 0,0 22/09/16 94 S. Lanquetin – L3 Info, Synthèse d’images 95 22/09/16 Exemple de Code • Texture rectangulaire 12*4 glBegin(GL_POLYGON); glTexCoord2f(0, 0); glVertex3f(0, 0, 0); glTexCoord2f(0.5, 0); glVertex3f(1, 0,0); glTexCoord2f(0.5, 0.5); glVertex3f(1, 1, 0); glTexCoord2f(0, 0.5); glVertex3f(0, 1,0); glEnd(); • Utilisation des 2/3 inf de la texture • Copié-collé de la texture jusqu'au ratio voulu • Boite : 30 polygones de largeur 12/30 et de hauteur 4 • Application des coord de text des 2/3 inf de la texture sur chaque polygone (0,0) (1/30,0)(1/30,2/3)(0,2/3) (1/30,0) (2/30,0)(2/30,2/3)(1/30,2/3) 1, 0s x2,y2 1,2/3 x2,y1 1,0 S. Lanquetin – L3 Info, Synthèse d’images Coord texture • Ratio 3 pour 1 or ratio texture : 2n pour 1 1, 1 t 0, 1 0, 0 96 1, 1 1, 0 s (2/30,0) (3/30,0)(3/30,2/3)(1/30,2/3) 16 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 97 Exemple de Code glBegin(GL_POLYGON); glTexCoord2f(0.5, 0); glVertex3f(0, 0, 0); glTexCoord2f(1, 0); glVertex3f(1, 0,0); glTexCoord2f(1, 0.5); glVertex3f(1, 1, 0); glTexCoord2f(0.5, 0.5); glVertex3f(0, 1,0); glEnd(); 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 98 Exemple de Code t 0, 1 0, 0 S. Lanquetin – L3 Info, Synthèse d’images 1, 1 1, 0 s 99 glBegin(GL_POLYGON); glTexCoord2f(0, 0); glVertex3f(0, 0, 0); glTexCoord2f(0.5, 0); glVertex3f(1, 0,0); glTexCoord2f(0.5, 1); glVertex3f(1, 1, 0); glTexCoord2f(0, 1); glVertex3f(0, 1,0); glEnd(); 22/09/16 t 0, 1 0, 0 S. Lanquetin – L3 Info, Synthèse d’images Les textures en OpenGL Paramètres de Texture // exemple d’association manuelle des coordonnées de texture 1 glBegin(GL_TRIANGLES); glTexCoord2f(1.0, 0.0); glVertex2f(-1.0, -1.0); 0 glTexCoord2f(1.0, 1.0); 1 0 glVertex2f(1.0, -1.0); y glTexCoord2f(0.0, 1.0); 1 glVertex2f(0.0, 1.0); glEnd(); 1 x • Paramètres d’enveloppement (Wrapping) 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 101 1, 1 1, 0 s 100 Æ Que faire quand s et t sont en dehors de (0,1) • Modes de filtrage Æ Moyennes de régions plutôt que texels • Mipmapping Æ Textures à différentes résolutions • Paramètres d’environnement Æ Comment la texture interagit avec la lumière S. Lanquetin – L3 Info, Synthèse d’images Paramétrage : bords de texture Mode d’enveloppement • Pour chaque dimension (s et t) : • Répétition de la texture • ou prolongement avec la dernière valeur • bordure Pincement: 1 si s,t > 1, 0 si s,t <0 Répétition: s,t modulo 1 102 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ) t s texture GL_REPEAT répétition GL_CLAMP pincement 17 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 103 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 104 Paramétrage : bords de texture Interpolation glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, R,G,B,A) OpenGL utilise l’interpolation bilineaire pour trouver des texels entiers à partir des coordonnées de texture spécifiées Distortions possible texture étirée t bonne sélection des coord de tex sur un trapèze montrant les effets de interpolation bilinéaire mauvaise sélection des coord de tex s texture 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 105 Paramétrage : post-filtrage 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 106 Filtrage : Agrandissement et Réduction glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, type) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, type) • Pour la réduction : Après transformations les texels correspondent rarement avec les pixels. • GL_NEAREST : point le plus proche dans la texture • GL_LINEAR : interpole entre les 4 points les plus proches • GL_NEAREST_MIPMAP_LINEAR : interpolation des 4 points les plus proches du mipmap le plus proche • GL_LINEAR_MIPMAP_LINEAR : interpolation des 4 points les plus proches dans l’interpolation des deux mipmaps les plus proches • Pour l’agrandissement : GL_NEAREST ou GL_LINEAR Texture Ecran Texture Agrandissement 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 107 Agrandissement et Réduction Un pixel couvert par plus d'un texel (réduction) ou Un texel couvre plus d'un pixel (agrandissement) Echantillonage de point (le texel le plus proche) ou filtrage linéaire (filtre 2 x 2) pour obtenir les valeurs de la texture 22/09/16 Ecran Réduction S. Lanquetin – L3 Info, Synthèse d’images 108 Filtrage : Agrandissement et Réduction Quelles valeurs de texel choisir pour le pixel? Interpoler ou moyenner les données? Æ Filtres OpenGL pour effectuer ces calculs. Fixer les méthodes de filtrage (agrandissement et réduction ) avec : glTexParameter*() Texture Polygon Agrandissement Texture Polygon Réduction 18 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 109 Mode de filtrage 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 110 Filtrage Modes déterminés par glTexParameter{if}[v](target, pname, param) glTexParameteri( target, type, mode ) target = GL_TEXTURE_2D, GL_TEXTURE_1D glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); Paramètres Valeurs GL_TEXTURE_WRAP_S GL_CLAMP, GL_REPEAT GL_TEXTURE_WRAP_T GL_CLAMP, GL_REPEAT GL_TEXTURE_MAG_FILTER GL_NEAREST, GL_LINEAR GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR Le filtrage linéaire nécessite une bordure d’un texel supplémentaire pour filtrer aux bords (border = 1) GL_TEXTURE_BORDER_COLOR 4 valeurs entre 0 et 1 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 111 Filtrage 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 112 Filtrage GL_NEAREST choisit le texel le plus proche du centre du pixel Quatre choix de filtres sont possibles avec réduction. Pour un plan mipmap donné on peut choisir : GL_LINEAR fait une moyenne des 4 texels les plus proches. GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR Lorsque les coordonnées texels sont proches de la bordure de la texture, le résultat dépend de GL_REPEAT ou de GL_CLAMP Pour choisir les 2 meilleurs plans utiliser : GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Modulation et mélange Textures utilisées comme couleur des surfaces Textures pour moduler les couleurs des objets ou pour mélanger la texture avec la couleur des objets. Trois types de fonctions selon les arguments de glTexEnv*() 113 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 114 Paramétrage : combinaison avec le fragment • glTexEnv permet de contrôler la façon dont la texture est appliquée sur le fragment glTexEnv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode) ; • Les modes les plus utilisés sont • GL_MODULATE : multiplie la couleur du fragment par celle du texel • GL_BLEND : mélange la couleur du fragment et celle du texel • GL_REPLACE : remplace le fragment par le texel • Il existe aussi un mode GL_DECAL similaire à GL_REPLACE pour RGB 19 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 115 Paramétrage : correction de la perspective 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 116 Modulation et mélange • Deux modes d’interpolation • linéaire • utilisant les informations de profondeur/perspective (lent) glTexEnv{if}[v](target, pname, param) • Choix du mode par glHint(GL_PERSPECTIVE_CORRECTION_HINT, hint) ; où hint est GL_DONT_CARE, GL_NICEST ou GL_FASTEST target = GL_TEXTURE_ENV si pname = GL_TEXTURE_ENV_MODE param = GL_DECAL, GL_MODULATE, GL_BLEND indique comment la texture est combinée avec la couleur de l’objet si pname = GL_TEXTURE_ENV_COLOR param est un vecteur RGBA. Ces valeurs sont utilisées si la fonction de texture GL_BLEND a été spécifiée 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 117 Pile de matrices texture 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 118 Objet de Texture Comme pour les objets, on peut appliquer des matrices de transformations sur les textures. • OpenGL 1.1 et plus. Ne pas oublier de se mettre dans le mode correspondant • Etapes des objets de texture • Générer des noms de texture • Lier les objets de texture aux données de texture • Fixer les propriétés pour chaque objet de texture • Pour le rendu, rappeler les objets de texture • Passer plus rapidement d’une texture à l’autre • TexImage(…) 1 fois /texture Exemple : glMatrixMode(GL_TEXTURE); glTranslatef(.......); ............ glMatrixMode(GL_MODELVIEW); 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 119 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images Cible et objet de texture Générer un identifiant de texture • Cible de texture = type de texture : 1D, 2D, 3D … • Générer des noms de texture • Objets de texture pour utiliser plusieurs textures 120 glGenTextures( n, *texIds ); • n = nombre de noms de textures à générer • texIds = tableau d’entiers identifiant les textures • Exemple unsigned int texIds[5]; glGenTextures(5, texIds) 20 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 121 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 122 Lier des Textures Objet de Texture • Lier les textures avec GLuint texObject[2]; // objet texture glGenTextures(2, texObject); // génère un nouvel objet de texture glBindTexture( target, id ); • attribuer une id de texture à un type de texture • 3 sortes de textures • GL_TEXTURE_1D • GL_TEXTURE_2D • GL_TEXTURE_3D // LierTexture 1 glBindTexture(GL_TEXTURE_2D, texObject[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); // Lier Texture 2 glBindTexture(GL_TEXTURE_2D, texObject[1]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, image2); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); • Exemple glBindTexture(GL_TEXTURE_2D, texIds[0]); 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 123 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 124 Génération automatique des Coordonnées de Texture Objet de Texture // Une sphère avec texture 1: glBindTexture(GL_TEXTURE_2D, texObject[0]); glutSolidSphere(1.0, 16, 16); • OpenGL peut générer les coordonnées de texture automatiquement glTexGen{ifd}[v]() // une théière avec texture 2: glBindTexture(GL_TEXTURE_2D, texObject[1]); glutSolidTeapot(1.0); … • spécifier un plan • génère des coordonnées de texture en fonction de la distance au plan • modes de génération • GL_OBJECT_LINEAR • GL_EYE_LINEAR • GL_SPHERE_MAP (utilisé pour les cartes environnementales) 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 125 Génération automatiquedes Coordonnées de Texture • glTexGen{ifd}(coord, pname, param) coord : GL_S, GL_T, GL_R or GL_Q pname : GL_TEXTURE_GEN_MODE param : GL_OBJECT_LINEAR, GL_EYE_LINEAR ou GL_SPHERE_MAP pname : GL_OBJECT_PLANE ou GL_EYE_PLANE, param : p1, p2, p3, p4 (param de génération de texture) 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 126 Automatic Texture-Coordinate Generation 1/4 • void glTexGen{ifd}[v](GLenum coord, GLenum pname, TYPEparam); • coord can be GL_S, GL_T, GL_R, GL_Q pname param GL_TEXTURE_GEN_MODE GL_OBJECT_LINEAR, GL_GL_EYE_LINEAR, GL_SPHERE_MAP Plane coefficient array Plane coefficient array GL_OBJECT_PLANE GL_EYE_PLANE 21 22/09/16 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 127 Génération automatique des Coordonnées de Texture 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 128 Génération automatique des Coordonnées de Texture • Tableau de coefficient du plan • Environnement Map • Appliquer le code suivant glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); • Plan généré = p1X + p2Y + p3Z + p4W • p1, p2, p3, p4 : composants du tableau. • GL_TEXTURE_GEN_MODE • (a) GL_OBJECT_LINEAR avec plan x = 0 • (b) GL_OBJECT_LINEAR avec plan x+y+z = 0 • (c) GL_EYE_LINEAR avec plan x = 0 • La constante GL_SPHERE_MAP crée les coordonnées de texture pour l’environnement mapping 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 129 Génération automatique des Coordonnées de Texture Sphere Map 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 130 Placage de texture 2D avec OpenGL Object with Environment Map • spécifier les données de la texture • lire les données ou les générer • associer les données à un objet de texture • spécifier les paramètres du placage • correction de la perspective • comportement au niveau des bords • post-filtrage • combinaison avec le fragment • dessiner la (les) primitive(s) • activer la texture • associer des coordonnées de textures à chaque vertex (manuellement ou automatiquement) Ne fonctionne qu’en RGBA 22/09/16 S. Lanquetin – L3 Info, Synthèse d’images 131 Tutorial: Texture 22