Gestion de plusieurs textures sous OpenGL sous Linux
But:
Afficher un dès à six faces...Impliquant la gestion de plusieurs textures (1 par face !).
Comment faire:
Vous avez déjà vu la commande glTexImage2D() qui permet de définir l'image à utiliser comme texture par défaut.
Donc il suffirait de réutiliser cette fonction pour charger une nouvelle image...
Oui mais voilà, nous avons un problème : charger l'image...Cela implique consommation de temps pour transférer l'image de la mémoire vive vers la mémoire de la carte graphique. Cette solution n'est donc pas forcément la meilleur !
Création de plusieurs textures (valable à partir d'OpenGL 1.1):
Une solution plus intéressante consiste en fait à charger un maximum de textures dans la mémoire de la carte graphique, puis au moment de dessiner une texture, indiquer la texture à utiliser !
Pour y parvenir, il faudra identifier les textures. Vous utiliserez la fonction:glGenTextures()
void glGenTextures(
GLsizei n,
GLuint *idTextures);
avec en entrée:
n un nombre indiquant le nombre de textures à générer
textures un tableau de type GLuint qui va contenir les n identifiant de textures générées.
Contrairement aux
fonctions précédemment étudiées, ici, nous ne précisons
pas la dimension de la texture (type 1D, 2D ou 3D). Cette fonction ne générant
que des identifiants, pour lesquels nous pourront affecter tous types de dimensions.
En sortie, la fonction retourne si erreur
GL_INVALID_VALUE dans le cas ou n est négatif...
GL_INVALID_OPERATION si lancée entre glBegin et glEnd.
Une fois les identifiants générés, vous allez pouvoir créer les différentes textures.
La création des différentes textures étant exactement la même que la création d'une seule texture (voir chapitre précédent), il n'y a donc qu'une nouvelle fonction à ajouter avant la création de la texture qui permettra d'indiquer l'identifiant de la texture à utiliser par défaut. C'est le rôle de la fonction glBindTexture().
C'est cette fonction qui va créer votre objet texture 1D, 2D ou 3D.
Elle attend donc tout normalement le type de dimension et l'identifiant de la texture...
void glBindTexture
( GLenum target
, GLuint idtexture
);
Avec en entrée:
target GL_TEXTURE_1D, GL_TEXTURE_2D ou GL_TEXTURE_3D !
idtexture identifiant de la texture à définir comme identifiant par défaut.
En sortie,
GL_INVALID_ENUM si target n'est pas bon
GL_INVALID_OPERATION si la texture ne supporte
pas la dimension sélectionnée ou si la fonction est utilisée
entre glBegin et glEnd.
Utilisation de plusieurs textures (valable à partir d'OpenGL 1.1):
Maintenant que vos textures sont créées, vous allez les utiliser !
et en fait, il n'y a pas non plus beaucoup de changements...
Il suffit en effet d'indiquer l'identifiant de la texture à utiliser avant d'associer un texel à un vertex.
Et vous réutiliserer pour cela la fonction glBindTexture() qui permettra d'indiquer la texture par défaut !
N'oubliez pas
que la fonction doit être déclenchée hors de glBegin
et glEnd et après avoir créer une texture !
Ne plus utiliser de texture:
Si, pour un objet, vous ne voulez pas gérer de texture, il suffit d'utiliser la fonction glBindTexture() en indiquant comme numéro de texture la valeur 0.
Supprimer les textures créées:
Pour effacer les textures de la mémoire, il suffit d'utiliser glDeleteTextures()
void glDeleteTextures
( GLsizei n
, const GLuint *idtextures
);
avec n, le nombre de textures à supprimer
idtextures, un tableau des identifiants de textures à supprimer.
Exemple de code:
Affichage d'un dès en reprenant le code du cube précédent...
Placez les images dans le répertoire courant de votre application.