Bonjour,

Après avoir passé quelques heures à chercher ce qui n'allait pas, je me permets de partager mon problème à vous, qui avez certainement plus d'expérience en la matière

Je développe une application sous Windows avec OpenGL. J'utilise WinAPI pour gérer la fenêtre, et DevIL pour charger les pixels d'une image.

Le problème est que dès que j'utilise la fonction glBindTexture avec un autre nom de texture que 0 (la texture par défaut), je n'ai plus aucune texture qui s'affiche (tout est blanc). D'ailleurs même si j'appelle la fonction glIsTexture, c'est terminé plus de texture non plus, même si elle renvoie GL_TRUE et que je bind ce nom de texture après

Si je ne fais appel ni à glGenTextures, ni à glBindTexture, c'est la dernière texture chargée qui est utilisée pour tout (je suppose que glTexImage2D charge dans la texture par défaut si on appelle pas glBindTexture).

Voici le code des deux fonctions utilisées :

--- Chargement de texture ---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
bool Graphics::LoadTexture ( unsigned int * texId, const string & filename )
{
	assert( texId );
 
	// Create the texture
	ILuint ilTexId;
	ilGenImages( 1, &ilTexId );		// glGenTextures( 1, (GLuint *)texId );
	ilBindImage( ilTexId );			// glBindTexture( GL_TEXTURE_2D, (GLuint)*texId );
 
	// Load the image
	if ( ilLoadImage( filename.c_str() ) == IL_FALSE )
		return false;
 
	glGenTextures( 1, texId );
	glBindTexture( GL_TEXTURE_2D, *texId );
 
	glTexImage2D( GL_TEXTURE_2D, 0,
		ilGetInteger( IL_IMAGE_BPP ),		// Number of bytes per pixel
		ilGetInteger( IL_IMAGE_WIDTH ),		// Width of the texture
		ilGetInteger( IL_IMAGE_HEIGHT ),	// Height of the texture
		0, ilGetInteger( IL_IMAGE_FORMAT ),	// Image format
		GL_UNSIGNED_BYTE,
		(void*)ilGetData() );			// Pixel data
 
	// We can now delete the image variable
	ilDeleteImage( ilTexId );
 
	// Check for errors
	if ( glGetError() == GL_INVALID_VALUE )
		return false;
 
	return true;
}
--- Utilisation d'une texture ---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Graphics::EnableTexture ( unsigned int texId ) const
{
	// Enable texturing
	glEnable( GL_TEXTURE_2D );
 
	// Check if the texture name is correct
	if ( _DEBUG )
		if ( glIsTexture( texId ) == GL_FALSE )
			return false;
 
	// Set the current texture
	glBindTexture( GL_TEXTURE_2D, texId );
 
	return true;
}
La fonction qui charge est correctement appelée pour toutes les textures, les noms de texture sont corrects (de 1 à n), la fonction pour en utiliser une aussi, avant de dessiner l'objet auquel elle doit être appliquée. Là encore le nom de texture est correct (compris entre 1 et n à chaque fois), même glIsTexture me dit qu'il est bon.

Quand je dis que dès que j'appelle glBindTexture j'ai plus rien, c'est vraiment ça, même si je la rappelle après avec 0.

Je ne vois pas ce que je fais et qui ne va pas, et sinon d'où peut venir le problème ?...