3.1.5 La méthode chargerTextureVide()

L'étape suivante consiste à coder la méthode qui nous permettra de créer des textures vides. Elle utilisera pour cela les attributs précédemment initialisés, elle s'appellera tout simplement chargerTextureVide() :

1
void chargerTextureVide();

Elle ne prendra aucun paramètre.

Son code sera beaucoup plus simple que celui de la méthode charger() car elle n'aura pas besoin de charger une image, d'inverser ses pixels et de déterminer le format des couleurs. Nous avons déjà toutes ces informations grâce à notre nouveau constructeur.

On commence l'implémentation de la méthode en générant un nouvel identifiant d'objet OpenGL grâce à la fonction glGenTextures(). On en profitera au passage pour ajouter le code de vérification d'ID à l'aide la fonction glIsTexture() :

1
2
3
4
5
6
7
void Texture::chargerTextureVide(){
	// Destruction d'une éventuelle ancienne texture
	if(glIsTexture(m_id) == GL_TRUE) glDeleteTextures(1, &m_id);
	
	// Génération de l'ID
	glGenTextures(1, &m_id);
}

On ajoute ensuite le verrouillage a l'aide de la fonction glBindTexture() :

1
2
3
4
5
6
7
8
9
10
11
12
13
void Texture::chargerTextureVide(){
	// Destruction d'une éventuelle ancienne texture
	if(glIsTexture(m_id) == GL_TRUE) glDeleteTextures(1, &m_id);

	// Génération de l'ID
	glGenTextures(1, &m_id);

	// Verrouillage
	glBindTexture(GL_TEXTURE_2D, m_id);

	// Déverrouillage
	glBindTexture(GL_TEXTURE_2D, 0);
}

Une fois le verrouillage enclenché, nous allons appeler la fonction glTexImage2D() qui permet de définir les caractéristiques d'une texture (dimensions, formats, etc.). Je vous redonne son prototype ainsi que sa flopée de paramètres :

1
void glTexImage2D(GLenum target,  GLint level,  GLint internalFormat,  GLsizei width,  GLsizei height,  GLint border,  GLenum format,  GLenum type,  const GLvoid * data);
  • target : Le type de la texture auquel nous donnerons, comme toujours, la constante GL_TEXTURE_2D
  • level : Paramètre que nous n'utiliserons pas, nous lui donnerons la valeur 0
  • internalFormat : Le format interne de la texture
  • width : Sa largeur
  • height : Sa hauteur
  • border : Une bordure, nous ne l'utiliserons pas et donnerons la valeur 0
  • format : Le format de la texture
  • type : Type de donnée des pixels (float, int, ...). Nous lui donnerons la constante GL_UNSIGNED_BYTE
  • data : Pixels de la texture, nous n'en avons pas encore et nous donnerons encore la valeur 0

Refaite une petite lecture lentement pour différencier correctement les paramètres. Remarquez aussi que nous utiliserons tous nos nouveaux attributs.

En appelant la fonction glTexImage2D() avec ces paramètres, on a :

1
2
// Définition des caractéristiques de la texture
glTexImage2D(GL_TEXTURE_2D, 0, m_formatInterne, m_largeur, m_hauteur, 0, m_format, GL_UNSIGNED_BYTE, 0);

Pour terminer la méthode, il ne nous manque plus qu'à appliquer les filtres avec la fonction glTexParameteriv(). Vous vous souvenez de ce que sont les filtres ? Ils permettent à OpenGL de savoir s'il doit améliorer ou baisser la qualité de la texture en fonction de notre distance par rapport à elle.

On utilisera les mêmes filtres que ceux de la méthode charger() :

1
2
3
// Application des filtres
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Ces filtres permettent à OpenGL d'affiner l'affichage des textures proches et de pixeliser celui des textures éloignées, le premier étant plus gourmand en calcul que le second.

Si nous réunissons ces bouts de code, on trouve la méthode chargerTextureVide() suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Texture::chargerTextureVide(){
	// Destruction d'une éventuelle ancienne texture
	if(glIsTexture(m_id) == GL_TRUE) glDeleteTextures(1, &m_id);

	// Génération de l'ID
	glGenTextures(1, &m_id);

	// Verrouillage
	glBindTexture(GL_TEXTURE_2D, m_id);
		// Définition des caractéristiques de la texture
		glTexImage2D(GL_TEXTURE_2D, 0, m_formatInterne, m_largeur, m_hauteur, 0, m_format, GL_UNSIGNED_BYTE, 0);

		// Application des filtres
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	// Déverrouillage
	glBindTexture(GL_TEXTURE_2D, 0);
}

Grâce à elle, nous pourrons créer tous les Colors Buffers que nous voudrons. Il suffira juste de faire attention aux paramètres que nous donnerons.