IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Transparence et OpenGL


Sujet :

OpenGL

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut Transparence et OpenGL
    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.

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Par défaut
    C'est simple, la SDL ne gère qu'une couleur de transparence pour chaque image il me semble

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Oui ça je sais, mais ce n'est pas le problème car quand je fais un truc comme ça en SDL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    image1 = IMG_Load("mon_image_transparente.png");
    image2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1024, 768, 32, 0, 0, 0, 0);
    SDL_SetColorKey(image2, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB(image2->format, 0, 0, 0));
     
    SDL_BlitSurface(image1, NULL, image2, NULL);
    SDL_BlitSurface(image2, NULL, ecran, &position);
    En fait je charge une image avec des informations de transparence, je crée une surface vide et je la rend complètement transparente, je colle la 1ere image sur la 2eme et je l'affiche, ça marche ! Je peux voir l'image derrière les 2 surfaces.

    Mais si je charge cette même image en OpenGL ça ne passe pas ... la transparence disparait ... et je ne vois pas du tout pourquoi dans un cas ça marche mais pas dans l'autre

  4. #4
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Pour que ça soit plus claire je vais mettre les résultats des tests fait en SDL en images :

    http://ups.imagup.com/06/1264157381.jpeg

    A gauche l'image telle qu'elle devrait être, la surface ecran est bleu et on peut la voir à travers le hublot.
    A droite c'est la même image mais que j'ai d'abord blité sur une surface intermédiaire. On ne voit pas le fond bleu => l'image n'est pas transparente.


    http://ups.imagup.com/06/1264157408.jpeg

    Ici les mêmes images, la seule chose qui change est :
    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 donc d'abord rendu la surface d'accueil transparente et ce n'est qu'après que je fais un blit. Dans ce cas là on voit très bien l'image situé derrière.



    Donc normalement le coté SDL est OK. C'est du coté de l'openGL que ça bloque.

Discussions similaires

  1. Problème de transparence avec OpenGL
    Par yann458 dans le forum OpenGL
    Réponses: 15
    Dernier message: 16/12/2011, 08h43
  2. Problème transparence texture (OpenGL + Qt)
    Par killerjeff dans le forum OpenGL
    Réponses: 2
    Dernier message: 25/02/2010, 15h24
  3. Transparence en OpenGL sans glBlendColor
    Par goast dans le forum OpenGL
    Réponses: 6
    Dernier message: 30/06/2008, 21h25
  4. opengl et background transparent
    Par venomelektro dans le forum OpenGL
    Réponses: 1
    Dernier message: 06/11/2006, 12h17
  5. Réponses: 5
    Dernier message: 18/03/2005, 20h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo