Placage de texture (2/2)
Par Xavier Michelon


 
 
Utilisation de plusieurs textures

La dernière fois, nous avons plaqué sur chacune des faces du cube la même image. Aujourd’hui, nous allons plaquer une image de bois sur 3 faces du cube, et une texture procédurale sur les 3 autres faces du cube. Il nous faut pour cela mettre en œuvre le mécanisme d’objets de texture qu’OpenGL met à notre disposition.

Lorsqu’on souhaite travailler avec plusieurs textures, il faut leur assigner un identifiant, c’est-à-dire un nombre entier. OpenGL dispose d’un système interne de gestion des identifiants de texture (‘texture ID’ en anglais). Lorsque vous voulez créer une texture, il vous faut demander à OpenGL de vous attribuer un identifiant en faisant un appel à la fonction

Void glGenTextures(GLsizei nombre,Gluint *idtextures)

‘nombre’ indique le nombre de textures que vous souhaiter créer, et ‘idtextures’ est un pointeur vers un tableau d’entiers qui contiendra au retour de la fonction les ‘nombres’ identifiants de texture que vous avez demandés.

Par la suite, on retrouve encore le mécanisme de machine à état d’OpenGL : vous définissez une texture active, et toutes les opérations sur les textures qui seront faites par la suite seront appliquées à la texture active. La fonction que vous permet de définir la texture active est glBindTexture(), dont le prototype est le suivant :

void glBindTexture(GLenum cible, Gluint idtexture)

‘cible’ correspond au type de texture utilisé (GL_TEXTURE_1D, GL_TEXTURE_2D ou GL_TEXTURE_3D). Ce paramètre est nécessaire car l’allocation d’espace pour la texture se fait lors du premier appel à glBindTexture() pour un numéro de texture donné, et non lors de l’attribution de l’identifiant. Le paramètre ‘idtexture’ désigne l’identifiant de la texture qu’on souhaite rendre active.

L’utilisation des textures dans un programme OpenGL se fait donc en général de la façon suivante :

- Lors de l’initialisation, on réserve les identifiants de texture et on crée les textures :

glGenTextures(2,IdTex);
glBindTexture(GL_TEXTURE_2D,IdTex[0]) ;
/* Création de la première texture (avec glTexParameteri(), glTexImage2D...) */
...
glBindTexture(GL_TEXTURE_2D,IdTex[1]) ;
/* Création de la deuxième texture */
...

- Au cours de la fonction d’affichage, on change éventuellement la texture active avant la description de chaque face :

void affichage()
{
...
glBindTexture(GL_TEXTURE_2D,IdTex[0]);
glBegin(GL_POLYGON); /* description de la face 1 */
glEnd();
 glBindTexture(GL_TEXTURE_2D,IdTex[1]);
glBegin(GL_POLYGON);
/* description de la face 2 */
glEnd();
...
}