Bonjour à tous
J'ai codé une petite fonction qui me permet de charger des images .png avec la transparence :
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 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); }
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.
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; } }
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 :
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
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);
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 ....
Code : Sélectionner tout - Visualiser dans une fenêtre à part SDL_SetColorKey(image2, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB(image2->format, 0, 0, 0));
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.
Partager