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

API graphiques Discussion :

DevIL + OpenGL : probleme de transparance


Sujet :

API graphiques

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 15
    Points : 11
    Points
    11
    Par défaut DevIL + OpenGL : probleme de transparance
    Bonsoir codeuses/codeurs,
    j'ai un petit soucis en ce qui concerne l'affichage d'une texture transparente.
    Tout d'abord je précise que je code en Delphi, et j'utilise la lib devil sous opengl et sdl.
    J'ai une image de fond, et par dessus une autre qui devrait etre transparante et afficher juste un texte (fichier tga en 32bits avec un masque alpha).

    Voici le code:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    procedure InitIntro(var tex: array of textures);
    begin
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glShadeModel(GL_SMOOTH);
        glClearDepth(1.0);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        //glEnable(GL_TEXTURE_2D);
        //glenable(gl_blend);
     
        ilInit();
        iluInit();
        ilutInit();
     
        ilTexImage(10,10,1,3,IL_RGBA,IL_UNSIGNED_BYTE,NIL);
     
        tex[0].background := ilutGLLoadImage('images/main/menu/loading.jpg');
        tex[1].background := ilutGLLoadImage('images/new.tga');
     
        ReSizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT );
     
        glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
     
        begin
          glLoadIdentity();
          Gltranslatef(1.5,0,-18);
          glBindTexture(GL_TEXTURE_2D, tex[0].background);
          glbegin(gl_polygon);
          glTexCoord2f(0.0, 0.0);  glVertex3f(-11, -7,  1.0);
          glTexCoord2f(1.0, 0.0);  glVertex3f( 8, -7,  1.0);
          glTexCoord2f(1.0, 1.0);  glVertex3f( 8, 8, 1.0);
          glTexCoord2f(0.0, 1.0);  glVertex3f(-11, 8,  1.0);
          glend();
        end;
     
        begin
          glLoadIdentity();
          Gltranslatef(1.5,0,-18);
          glBindTexture(GL_TEXTURE_2D, tex[1].background);
          //glblendfunc(gl_dst_color,gl_zero);
          glbegin(gl_polygon);
          glTexCoord2f(0.0, 0.0);  glVertex3f(-5, -5,  1.1);
          glTexCoord2f(1.0, 0.0);  glVertex3f( 4, -5,  1.1);
          glTexCoord2f(1.0, 1.0);  glVertex3f( 4, 3, 1.1);
          glTexCoord2f(0.0, 1.0);  glVertex3f(-5, 3,  1.1);
          glend();
        end;
     
      SDL_GL_SWAPBUFFERS;
     
      //gldisable(gl_blend);
     
    end;
    Si j'active gl_blend, l'image devient bien transparante mais pas selon le masque alpha (qui est totalement ignoré) donc le resultat attendu n'est pas le bon...
    Je fais certainement une grosse betise dans ce code mais impossible de trouver malgré de tres nombreux essais (google est mon ami mais ne m'a pas aidé...)

    merci de votre aide

  2. #2
    Membre actif
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 211
    Points
    211
    Par défaut
    Salut,

    Je suis pas un expert mais essaye en t'appuyant la dessus :

    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
     
    // Activation des textures
    glEnable (GL_TEXTURE_2D);
    // Activation de la tranparence
    glEnable (GL_BLEND);
    // Activation du masquage des faces arrières
    glEnable (GL_CULL_FACE);
     
    // Défini le mode de transparence
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
    //Ici BindTexture et dessin du polycon.
     
    glDisable (GL_CULL_FACE);
    glDisable (GL_BLEND);
    glDisable (GL_TEXTURE_2D);
    Je pense pas que le load des textures à cet endroit soit une bonne idée. Fais le dans une fonction d'init car sinon tu vas les loader à chaque appel de ta fonction et ça va mouliner.

    a+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    merci de ta réponse,
    cependant comme je l'ai indiqué je ne souhaite pas utiliser gl_glend. Tout simplement car il prend la couleur blanche (ou noire) comme transparante or dans mon image, je veut "garder" une partie du blanc. Je voudrais juste pouvoir utiliser le mode RGBA... Sinon cette procedure n'ai appelé qu'une seule fois au lancement du jeu et correspond à un fond d'écran de chargement, donc le probleme ne se pose pas ici^^ et derriere, toute l'initialisation et les chargements s'effectuent.

  4. #4
    Membre habitué Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Points : 177
    Points
    177
    Par défaut
    Le blending ( mélange en anglais ) ne se résume pas vraiment à "prendre une couleur comme transparente" hein

    Jette un coup d'oeil à la doc de glBlendFunc, ça permet de définir comment la couleur de ton fragment va être mélangé avec la couleur deja présente dans le frame buffer.

    Ce que te proposes blendy est d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    Donc soit Sr, Sg, Sb, Sa les composantes r g b a de la source ( ce que tu as texturé ) et Dr Dg Db Da pour la destination ( ce qui est deja dans le frame buffer, les autres trucs affichés avant ).

    GL_SRC_ALPHA , dit que la couleur de la source va être multipliée par son coefficient alpha. Et GL_ONE_MINUS_SRC_ALPHA dit que la couleur de la destination va être multipliée par ( 1 - Sa )
    Et la couleur finale est la somme des deux.

    C'est la meilleure configuration pour la transparence, tu peux faire tout plein de configuration pour obtenir des effets de mélange differents.
    La valeur par défaut de glBlendFunc est (GL_ONE, GL_ZERO) , ça multiplie par 1 la couleur de la source et par 0 celle de la destination, puis fait l'addition.
    En gros la couleur de la source remplace celle de la destination, ce qui n'est pas vraiment l'ideal pour la transparence

    Bref, essaie ce que t a donné Bundy, ça devrait marcher
    J'espere que tu as suivi mon topo sur le blending :p
    Reflechir peut s'averer utile, sisi.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    wow ca marche ! Merci beaucoup à vous deux !

    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    ca marche super bien ca!
    Oui j'ai bien suivis (avec une explication sur un site) le cours

    Une autre question me vient a lesprit maintenant que ca marche:
    lorsque jai 2 objets sur un meme plan qui se croisent, la transparance ne marche pas, l'un des deux disparait.
    J'ai aussi le probleme sur 3 plans: cest a dire un fond d'écran, une textures qui passe en dessous d'une 3ieme >> là 2ieme devient invisible lorsque la 3ieme passe par dessus. Y a t il moyen de corriger ca?
    Je ne sais pas si j'ai été clair lol
    merci

  6. #6
    Membre habitué Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Points : 177
    Points
    177
    Par défaut
    Pour le problèmes des 2 objets sur le même plan, c'est une question de Z-buffer.

    En gros, quand tu actives le test de profondeur avec glEnable(GL_DEPTH_TEST), opengl va remplir le buffer de profondeur petit a petit avec ce que tu affiches, en ne stockant que la profondeur ( le Z ) de chaque pixel pour l'instant affichés.

    Quand il y a un autre truc à afficher, il va dabord comparer le Z du pixel à afficher et celui du pixel deja affiché.
    Si le test de profondeur passe, alors le pixel est affiché et la profondeur dans le Z buffer mise à jour, sinon opengl ne fait rien du pixel à afficher.

    Le test de profondeur est configurable via glDepthTest
    Toi tu as défini glDepthTest(GL_LESS) , ce qui signifie que le test de profondeur passe si le Z est strictement inferieur.
    Or tes deux objets sont dans le même plan, leur Z est donc égal, du coup le premier objet sera affiché en entier, et la partie du second qui croise le premier ne sera pas affichée.

    Pour remédier à ça, il faut dire que le test passe si le 2 est inferieur ou égal
    glDepthTest(GL_LEQUAL) ( Less or EQUAL )
    Jette un coup d'oeil à la doc pour plus de détails

    Ensuite pour tes 3 plans, si tu décortiques un peu la formule de transparence avec (GL_SRC_ALPHA , GL_MINUS_SRC_ALPHA) , tu t'apercervras que la transparence ne marche correctement que si tu affiches dabord les objets opaques ( ton fond apriori ), puis les objets transparents du plus éloigné au plus proche, sinon opengl mélangera les couleurs n importe comment :p
    Reflechir peut s'averer utile, sisi.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    GL_LEQUAL ca marche très bien !
    Merci à vous tous pour vos réponses clair et rapides (et qui fonctionnent) !


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX2004] Probleme de transparence
    Par Sorento dans le forum Flash
    Réponses: 2
    Dernier message: 15/06/2005, 09h21
  2. Réponses: 4
    Dernier message: 31/03/2005, 10h33
  3. Probleme de transparence ... rho encore :/
    Par Clad3 dans le forum OpenGL
    Réponses: 28
    Dernier message: 13/01/2005, 13h17
  4. probleme de transparence avec fog
    Par Daedar dans le forum OpenGL
    Réponses: 10
    Dernier message: 03/05/2004, 08h14
  5. Probleme de transparance
    Par billyboy dans le forum DirectX
    Réponses: 1
    Dernier message: 12/02/2004, 19h40

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