Bonjour à tous

J'ai codé une petite fonction qui me permet de charger des images .png avec la transparence :

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
void chargement_PNG_texture(char nom_du_fichier[], GLuint *texture)
{
  SDL_Surface *imageSDL = NULL;
 
  imageSDL = IMG_Load(nom_du_fichier);
 
  glGenTextures( 1, &texture[0] );
 
  glBindTexture( GL_TEXTURE_2D, texture[0] );
 
  glTexImage2D( GL_TEXTURE_2D, 0, 4, imageSDL->w,
		imageSDL->h, 0, GL_RGBA,
		GL_UNSIGNED_BYTE, imageSDL->pixels );
 
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
 
  SDL_FreeSurface(imageSDL);
}
Cette fonction là marche très bien, cependant j'ai voulu aller plus loin, en créant une fonction qui charge plusieurs images, crée une SDL_Surface suffisamment grande pour les contenir et charge cette grande image.

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
 
 
  surface_d_accueil = SDL_CreateRGBSurface(SDL_HWSURFACE, largeur_totale, hauteur_totale, 32, 0, 0, 0, 0);
 
  /*On colle toutes les textures sur cette surface dans l'ordre de lecture, tout en notant les coordonnees
  de chaque coin de l'image, ces informations seront stockées dans le tableau de structure : coordonnes_textures*/
  for(i = 0 ; i < nombre_de_textures ; i++)
  {
    if(numero_de_texture_valide[i])
    {
      if( (position.x + images[i]->w) > largeur_totale)
      {
	position.x = 0;
	position.y += hauteur_max;
      }
 
      SDL_BlitSurface(images[i], NULL, surface_d_accueil, &position);
      coordonnes_textures[i].bas_gauche.x = (position.x) / largeur_totale;				coordonnes_textures[i].bas_gauche.y = (position.y + images[i]->h) / hauteur_totale;
      coordonnes_textures[i].bas_droite.x = (position.x + images[i]->w) / largeur_totale;		coordonnes_textures[i].bas_droite.y = (position.y + images[i]->h) / hauteur_totale;
      coordonnes_textures[i].haut_gauche.x = (position.x) / largeur_totale;				coordonnes_textures[i].haut_gauche.y = (position.y) / hauteur_totale;
      coordonnes_textures[i].haut_droite.x = (position.x + images[i]->w) / largeur_totale;		coordonnes_textures[i].haut_droite.y = (position.y) / hauteur_totale;
 
      position.x += images[i]->w;
    }
  }
Ca me permet de ne faire qu'un seul appel de texture puis de jouer uniquement sur les coordonnées pour passer d'une image à une autre.

Mais là grande surprise, je perds l'information de transparence ! Après avoir fait un petit test en SDL pour voir comment sont chargé les images, j'ai constaté que si je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
image1 = IMG_Load("mon_image_transparente.png");
image2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1024, 768, 32, 0, 0, 0, 0);
SDL_BlitSurface(image1, NULL, image2, NULL);
SDL_BlitSurface(image2, NULL, ecran, &position);
C'est en fait le fond de "image2" qui apparait à la place de la zone transparente et le fait de rendre ce fond transparent grâce à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SDL_SetColorKey(image2, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB(image2->format, 0, 0, 0));
Règle le problème, mais uniquement en SDL !? En OpenGL, même avec cette ligne en plus la transparence n'est pas au rendez vous ....

J'ai essayé alors le tuto de nehe (leçon n°20), mais le problème c'est que pour faire fonctionner sa méthode il faut faire glDisable(GL_DEPTH_TEST); et donc pour faire de la 3D c'est pas ce qu'il y a de mieux ...

Quelqu'un aurait un idée du pourquoi je perds la transparence en créant une surface intermédiaire ? Ou se trouve mon erreur ?

Si quelqu'un à une autre solution pour avoir des textures avec les informations de transparence, je suis preneur.

Merci d'avance.