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 ---
--- 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
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; }
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.
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; }
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 ?...![]()








Répondre avec citation
Partager