GRAPHISME PAR ORDINATEUR SIF-1032
Contenu du cours 10 Textures Lectures (Chapitre 8) Définir la texture Superposition d’une texture sur une surface plane Superposition d’une texture sur une surface courbe Lectures (Chapitre 8) Site NeHe: Leçons 6 et 7 NeHe’s OpenGL Tutorials: Chapitres 6 et 7 OpenGL Programming Guide: Chapitre 9 Textures (OpenGL 3.3+)
Textures Les textures 2D sont généralement des images de format .bmp Les textures 2D servent à remplacer des surfaces de géométrie complexe (ex: briques sur des murs) La superposition des textures sur des surfaces consiste à projeter l’espace de la texture représentée par des coordonnées (s,t) dans un plan dont les coordonnées sont données par des triplets (x,y,z)
Textures Exemples de superposition de textures 2D sur des surfaces (Voir leçon 6 de NeHe)
Textures Exemples de textures 2D (image .bmp, générée)
Textures Superposition des textures: transformation de l’espace des textures vers l’espace des surfaces World/Screen Texture/World
Textures Superposition des textures: transformation de l’espace des textures vers l’espace des surfaces
Textures Superposition des textures: transformation de l’espace des textures vers l’espace des surfaces TEXTURE SURFACE Transformation spatiale (x, y,z) Affectation de la couleur
Définir les textures images 2D (voir leçon 6) texture[]: une liste de pointeurs de texture
Définir les textures images 2D (voir leçon 6) AUX_RGBImageRec *texture1 crée un enregistrement pour le premier bitmap chargé et utilisé comme texture. Cet enregistrement contient les données RGB de l’image .bmp auxDIBImageLoad() charge l’image .bmp (ex: NeHe.bmp) et la stocke dans l’enregistrement texture1
Définir les textures images 2D (voir leçon 6) glGenTextures(1, &texture[0]) indique à OpenGL que nous voulons construire une texture et qu’elle soit stockée dans l’entrée 0 de texture[] glBindTexture(GL_TEXTURE_2D, texture[0]) indique à OpenGL que texture[0] (la première texture) sera une texture 2D glBindTexture() permet à OpenGL de pointer sur une zone mémoire où sera stockée la texture (&texture[0]). À la création de la texture elle est stockée dans cet emplacement de mémoire. Après, si un lien à la mémoire est effectué, OpenGL lira la texture correspondante à partir de cet emplacement de mémoire RAM
Définir les textures images 2D (voir leçon 6) Ces fonctions permettent de spécifier le type de filtrage utilisé quand l’image est plus grande (GL_TEXTURE_MAG_FILTER) à l’écran que la texture l’est en réalité, ou quand l’image est plus petite (GL_TEXTURE_MIN_FILTER) sur l’écran comparativement à la texture GL_LINEAR donne un aspect lisse à notre texture de proche ou de loin à l’écran. L’utilisation du paramètre GL_LINEAR se traduit par une charge de travail importante pour la carte vidéo ce qui peut ralentir notre système GL_NEAREST donne une texture beaucoup moins lisse et quand elle est agrandie à l’écran les formes de la texture deviennent carrée
Définir les textures images 2D (voir leçon 6) Création de la texture. Indique à OpenGL que la texture est 2D (GL_TEXTURE_2D). 0 représente le niveau de détail des images, habituellement à 0. 3 est le nombre de composantes de couleurs (RGB). texture1->sizeX donne automatiquement la largeur de la texture. texture1->sizeY donne la hauteur de la texture. Le zéro suivant est la bordure, habituellement laissé 0. GL_RGB indique à OpenGL que l’image est RGB. GL_UNSIGNED_BYTE représente la dimension en octet des composantes de couleurs de chaque pixel des images (unsigned char). texture1->data indique à OpenGL où sont stockées les données images associées à une texture
Définir les textures images 2D (voir leçon 6) LoadGLTextures() permet de charger l’image .bmp et permet la création de la texture glEnable(GL_TEXTURE_2D) active le mode texture mapping
Définir les textures images 2D (voir leçon 6) La fonction glBindTexture() permet de sélectionner la texture utilisée. Pour les autres textures il faudrait appeler la fonction glBindTexture(GL_TEXTURE_2D, texture[numéro de texture]). Il faut appeler cette fonction hors des énoncés glBegin() et glEnd().
Définir les textures images 2D (voir leçon 6) La fonction glTexCoord2f() permet de définir les coordonnées de textures. La première, la coordonnée x (s). 0.0f est à gauche de la texture. 0.5f dans le milieu et 1.0f à droite. La seconde, la coordonnée y (t). 0.0f est le bas de la texture. 0.5f est le milieu et 1.0f dans le haut.
Textures Définir les textures images 2D (voir leçon 6)
Définir les textures images 2D (voir leçon 6) La face frontale du cube est couverte avec la portion inférieure gauche de la texture
Textures Définir les textures images 2D (voir leçon 6)
Définir les textures images 2D (voir leçon 6) La face frontale du cube est couverte avec la portion supérieure droite de la texture
Textures Définir les textures images 2D (voir leçon 6)
Définir les textures images 2D (voir leçon 6) La face frontale du cube est couverte avec une répétition de la texture de 2 en x et y
Textures Définir les textures images 2D (voir leçon 6)
Définir les textures images 2D (voir leçon 6) La face frontale du cube est couverte avec une répétition de la texture de 4 en x et de 2 en y
Textures Définir les textures images 2D (voir leçon 6)
Définir les textures images 2D La fonction glTexImage2D() permet de définir une texture image 2D avec OpenGL Paramètres: Type de texture: GL_TEXTURE_2D Niveau de détail: 0 en général Nombre de composantes de couleur (1 à 4) Largeur de la texture image (puissance de 2 [64, 256]) Hauteur de la texture image (puissance de 2 [64, 256]) Largeur de la bordure (0, 1 ou 2) Format des pixels (ex: GL_RGB, GL_RGBA ..) Type de chaque valeur des pixel (ex: GL_UNSIGNED_BYTE) Séquence de pixels
Définir les textures images 2D Modes de rendu de texture (couleur VS illumination) GL_MODULATE: permet de faire le rendu des surfaces texturées en considérant les propriétés des surfaces (couleurs, propriétés de réflexion) et l’illumination. Ce mode est celui par défaut et le plus utilisé GL_DECAL: seule l’information texturale sert à faire le rendu la couleur, les propriétés des surfaces et l’illumination ne changent en rien l’apparence de la texture GL_BLEND: permet la superposition de textures
Définir les textures images 2D Modes de rendu de texture Le mode de rendu de texture est initialisé par la fonction glTexEnvi() Paramètres: Type d’environnement texture: GL_TEXTURE_ENV Paramètre à définir: GL_TEXTURE_ENV_MODE (mode) GL_TEXTURE_ENV_COLOR (mode GL_BLEND) Mode ou couleur: modes: GL_MODULATE, GL_DECAL, GL_BLEND couleur: pointeur sur une valeur RGBA
Définir les textures images 2D Type d’interpolation utilisée pour déterminer la couleur correspondant à chaque point d’une surface projetée sur la texture GL_NEAREST: le voisin le plus proche GL_LINEAR: interpolation linéaire La fonction glTexParameteri() permet d’établir le mode d’interpolation Paramètres: Type de texture: GL_TEXTURE_2D Paramètre à définir: GL_TEXTURE_MIN_FILTER: réduction de la texture GL_TEXTURE_MAG_FILTER: agrandissement de la texture
Définir les textures images 2D La fonction glTexParameteri() permet d’établir le mode d’interpolation Paramètres: Type d’interpolation: GL_NEAREST GL_LINEAR
Définir les textures images 2D Spécification des coordonnées de texture par la commande glTexCoord2d() avec comme paramètres les coordonnées de texture s et t Ces coordonnées sont contenues dans l’intervalle [0.0,1.0]
Définir les textures images 2D Répétition de texture Quand les coordonnées de textures sortent de l’intervalle [0,1], nous pouvons imposer soit une répétition de la texture complète (GL_REPEAT) ou une répétition de la couleur correspondant à la bordure de la texture (GL_CLAMP)
Définir les textures images 2D Répétition de texture Les procédures: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT) permettent d ’établir le mode de répétition de texture
Définir les textures images 2D Répétition de texture (GL_CLAMP, voir leçon 6)
Définir les textures images 2D Répétition de texture (GL_CLAMP, Voir leçon 6)
Définir les textures images 2D Manipulation de plusieurs textures image La fonction glGenTextures() permet à OpenGL de réserver un ou plusieurs numéros (nom, référence) d’objet texture Gluint texture_objects[5]; glGenTextures(5,texture_objects); Gluint texture_object; glGenTextures(1,&texture_object);
Définir les textures images 2D Manipulation de plusieurs textures image La fonction glBindTexture() permet de sélectionner un objet texture nommé par glGenTextures() Gluint texture_object; glGenTextures(1,&texture_object); glBindTexture(GL_TEXTURE_2D,texture_object);
Superposition d’une texture sur une surface plane Exemple de superposition de texture (Voir projet Terrain1, terrain et ciel bleu) En premier lieu, nous avons besoin d’une fonction qui permet de charger la texture image (.bmp) La fonction TextureLoad() permet de faire ce chargement: Paramètres: Nom de fichier .bmp contenant la texture 2D Indicateur d’utilisation d ’image RGBA Min filter Mag filter Répétition
Textures
Textures (fonction TextureLoad())
Textures (fonction TextureLoad())
Textures (fonction TextureLoad())
Textures (Land.bmp, sky.bmp)
Textures (fonction Redraw(), ciel)
Textures (fonction Redraw(), terrain)
Textures (fonction Redraw(), terrain + ciel)
Textures (fonction Redraw(), ciel)
Textures (fonction Redraw(), terrain)
Textures (fonction Redraw(), terrain)
Textures (fonction Redraw(), terrain)
Superposition d’une texture sur des surfaces planes Génération d ’un terrain par fractal (Voir projet Terrain2) Algorithme fractal subdivise une surface plane et ajuste la hauteur des points milieux de façon aléatoire tp[].v
Textures (fonction Redraw(), fractal)
Textures (fonction BuildTerrain(), fractal)
Textures (fonction DivideTerrain(), fractal) // Élévation
Textures (fonction DivideTerrain(), fractal)
Superposition d’une texture sur des surfaces planes Génération automatique de coordonnées de texture La fonction glTexGen<t> permet d ’établir les paramètres de génération automatique de coordonnées de texture Cette fonction permet de générer les coordonnées (s,t) d ’une texture à partir des positions dans une forme de la scène glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR) SI GL_TEXTURE_GEN_MODE == GL_OBJECT_LINEAR ALORS Chaque sommet des objets est multiplié par le vecteur définit par GL_OBJECT_PLANE glTexGenfv(GL_S ,GL_OBJECT_PLANE, s_vector) s_vector représente une fonction de projection
Superposition d’une texture sur des surfaces planes Génération automatique de coordonnées de texture s_vector représente une fonction de projection glEnable(GL_TEXTURE_GEN_S) permet à OpenGL d’utiliser une séquence de coordonnées de texture générée
Superposition d’une texture sur des surfaces planes Génération automatique de coordonnées de texture glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP) SI GL_TEXTURE_GEN_MODE == GL_SPHERE_MAP ALORS Les coordonnées de texture sont générées dans une sphère par rapport à la position de visualisation ou l ’origine
Textures (Fonction Redraw(), projet Terrain3)
Textures (Fonction Redraw(), projet Terrain3) // Calcul par rapport à l ’observateur
Textures (Fonction Redraw(), projet Terrain3)
Textures (Avec Illumination, projet Terrain5) Ajout de l ’illumination et des normales à chaque surface N
Textures (Avec Illumination, projet Terrain5)
Textures (Avec transparence, projet Terrain6)
Textures Superposition d’une texture sur une surface courbe
Textures (OpenGL 3.3+) Découpage dans une texture (U,V => x, y, z)
Lecture d’une image .bmp (texture) Textures (OpenGL 3.3+) Lecture d’une image .bmp (texture) http://code.google.com/p/opengl-tutorial-org/source/browse/common/texture.cpp?r=0e89eb4ca7f7515f8baf5ef271ef76825f3734de&spec=svn24d30a5a643afe4bab458673054bc80b80a601c5 Prototype de la fonction loadBMP_custom() Appel de la fonction loadBMP_custom() Code de la fonction (déclarations)
Textures (OpenGL 3.3+) Code de la fonction (ouverture du fichier) Code la fonction (lecture de l’entête)
Textures (OpenGL 3.3+) Code de la fonction (validation du format d’image) Code de la fonction (lecture des dimensions) Code de la fonction (assignations)
Textures (OpenGL 3.3+) Code de la fonction (lecture de l’image) Création de la texture
Textures (OpenGL 3.3+) Lecture d’une image (uvtemplate.bmp)
Textures (OpenGL 3.3+) Utilisation des textures avec OpenGL (vertex shader)
Textures (OpenGL 3.3+) Utilisation des textures avec OpenGL (fragment shader)
Code du programme utilisant les textures (voir: Textures (OpenGL 3.3+) Code du programme utilisant les textures (voir: Création d’une référence sur l’échantillonneur de texture http://code.google.com/p/opengl-tutorial-org/source/browse/tutorial05_textured_cube/tutorial05.cpp
Textures (OpenGL 3.3+) Code du programme utilisant les textures (coordonnées des sommets et de texture)
Textures (OpenGL 3.3+) Code du programme utilisant les textures (coordonnées des sommets et de texture)
Textures (OpenGL 3.3+) Code du programme utilisant les textures (coordonnées de texture, Blender)
Textures (OpenGL 3.3+) Code du programme utilisant les textures (création d’un tampon pour stocker les coordonnées de texture) Associer la TEXTURE0 à la texture lue (Texture)
Textures (OpenGL 3.3+) Code du programme utilisant les textures (Attributions des tampons, traçage des triangles)
Textures (OpenGL 3.3+) Exemple d’exécution
Textures (OpenGL 3.3+) Exemple d’exécution Qualité du rendu est fonction du type d’interpolation
Textures (OpenGL 3.3+) Type d’interpolation (GL_NEAREST)
Textures (OpenGL 3.3+) Type d’interpolation (GL_LINEAR)
Type d’interpolation (GL_LINEAR) Textures (OpenGL 3.3+) Type d’interpolation (GL_LINEAR) f (1, 0) f (1, 1) f (x, y) f (0, 0) 1, 0 x x, 0 x, y 0, 0 1, 1 y f (0, 1) x, 1 0, 1
Textures (OpenGL 3.3+) Type d’interpolation (MIPMAP, selon la profondeur la texture est adaptée en modifiant sa résolution)
Textures (OpenGL 3.3+) Type d’interpolation (MIPMAP, selon la profondeur la texture est adaptée en modifiant sa résolution)