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 :

[2.1] Afficher du texte devant une scène (avec transparence)


Sujet :

OpenGL

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 050
    Points
    7 050
    Par défaut [2.1] Afficher du texte devant une scène (avec transparence)
    Je cherche à faire apparaitre du texte devant le reste de ma scène.
    Mais, pour faire ça propre, je souhaiterais que l'on puisse voir la scène entre les caractères (qu'on ne voit pas le fond de la texture contenant mon texte).

    J'avais lu qu'une technique pour obtenir ça, consistait à avoir une image avec le texte normal sur fond noir, et une deuxième image (masque) avec le même texte en noir sur fond blanc.


    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
             glPushMatrix;
                glDisable(GL_DEPTH_TEST);
                glEnable(GL_BLEND);
                glBlendFunc(GL_DST_COLOR, GL_ZERO);
     
                //.Masque.
                case _nDecompte of
                   3:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_MASQUE_3);
                   2:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_MASQUE_2);
                   1:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_MASQUE_1);
                   0:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_MASQUE_GO);
                end;
                glBegin(GL_QUADS);
                   glTexCoord2f(0, 0);      glVertex3f(-2.5, 2.5, 10);
                   glTexCoord2f(1, 0);      glVertex3f(2.5, 2.5, 10);
                   glTexCoord2f(1, 1);      glVertex3f(2.5, 7.5, 10);
                   glTexCoord2f(0, 1);      glVertex3f(-2.5, 7.5, 10);
                glEnd;
     
                //.Texture.
                glBlendFunc(GL_ONE, GL_ONE); 
                case _nDecompte of
                   3:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_3);
                   2:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_2);
                   1:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_1);
                   0:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_GO);
                end;
                glBegin(GL_QUADS);
                   glTexCoord2f(0, 0);      glVertex3f(-2.5, 2.5, 10);
                   glTexCoord2f(1, 0);      glVertex3f(2.5, 2.5, 10);
                   glTexCoord2f(1, 1);      glVertex3f(2.5, 7.5, 10);
                   glTexCoord2f(0, 1);      glVertex3f(-2.5, 7.5, 10);
                glEnd;
     
                glBindTexture(GL_TEXTURE_2D, 0);
                glDisable(GL_BLEND);
                glEnable(GL_DEPTH_TEST);
             glPopMatrix;
    Mais j'obtiens ce résultat :



    La couleur du texte est pâle, et on voit le fond en gris.


    Je suis allé voir la FAQ, et j'ai testé la solution avec GL_ALPHA_TEST :
    Code pour renseigner la couleur alpha à 0, si la couleur est noire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(TRGBQuad(PtrBitmapAvance^).rgbRed = 0) and (TRGBQuad(PtrBitmapAvance^).rgbGreen = 0) and (TRGBQuad(PtrBitmapAvance^).rgbBlue = 0) then
       TRGBQuad(PtrBitmapAvance^).rgbReserved := 0;
    Affichage :
    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
             glPushMatrix;
                glEnable(GL_ALPHA_TEST);
                glAlphaFunc(GL_GREATER, 0);
     
                case _nDecompte of
                   3:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_3);
                   2:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_2);
                   1:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_1);
                   0:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_GO);
                end;
                glBegin(GL_QUADS);
                   glTexCoord2f(0, 0);      glVertex3f(-2.5, 2.5, 10);
                   glTexCoord2f(1, 0);      glVertex3f(2.5, 2.5, 10);
                   glTexCoord2f(1, 1);      glVertex3f(2.5, 7.5, 10);
                   glTexCoord2f(0, 1);      glVertex3f(-2.5, 7.5, 10);
                glEnd;
     
                glBindTexture(GL_TEXTURE_2D, 0);
                glDisable(GL_ALPHA_TEST);
             glPopMatrix;
    Mais j'obtiens ce résultat :



    C'est encore pire : le fond est encore plus sombre (et plus visible).


    J'ai testé l'autre solution proposée par la FAQ : glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    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
             glPushMatrix;
                glDisable(GL_DEPTH_TEST);
                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
                case _nDecompte of
                   3:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_3);
                   2:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_2);
                   1:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_1);
                   0:
                      glBindTexture(GL_TEXTURE_2D, TEXTURE_GO);
                end;
                glBegin(GL_QUADS);
                   glTexCoord2f(0, 0);      glVertex3f(-2.5, 2.5, 10);
                   glTexCoord2f(1, 0);      glVertex3f(2.5, 2.5, 10);
                   glTexCoord2f(1, 1);      glVertex3f(2.5, 7.5, 10);
                   glTexCoord2f(0, 1);      glVertex3f(-2.5, 7.5, 10);
                glEnd;
     
                glBindTexture(GL_TEXTURE_2D, 0);
                glDisable(GL_BLEND);
                glEnable(GL_DEPTH_TEST);
             glPopMatrix;
    Cette fois le texte est à peine visible, et le fond est toujours là :



    Il y a certainement quelque chose que je fais mal, mais je ne vois pas quoi.
    Une idée ?


  2. #2
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Tu as essayé de gérer des textures avec du alpha?
    (du coup ton masque serait compris dans l'image et ça deviendrait assez simple)

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 050
    Points
    7 050
    Par défaut
    Citation Envoyé par TNT89 Voir le message
    Tu as essayé de gérer des textures avec du alpha?
    (du coup ton masque serait compris dans l'image et ça deviendrait assez simple)
    C'est à dire ?
    Il faut donner quelle valeur ?

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Bonjour,

    TNT89 indique de déclarer la map de "font" avec un canal Alpha (Texture RGBA)

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 050
    Points
    7 050
    Par défaut
    Citation Envoyé par Ti-R Voir le message
    TNT89 indique de déclarer la map de "font" avec un canal Alpha (Texture RGBA)
    J'ai essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexImage2D(GL_TEXTURE_2D, 0, 3, nDimX, nDimY, 0, GL_RGB, GL_UNSIGNED_BYTE, pPixelsData);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexImage2D(GL_TEXTURE_2D, 0, 4, nDimX, nDimY, 0, GL_RGBA, GL_UNSIGNED_BYTE, pPixelsData);
    mais ça plante.
    Donc, il faut faire quelque chose d'autre, mais quoi ?

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 475
    Points
    11 475
    Billets dans le blog
    11
    Par défaut
    IL faut aussi que tu modifies ton image, (soit le fichier image, soit le buffer une fois que le fichier est chargé) pour lui ajouter l'alpha. Car effectivement, si tu essaies de passer un buffer RGB et que tu dis à OpenGL de l'interpréter comme un RGBA, il y aura un dépassement de buffer.
    Dans mon moteur, au chargement de l'image, je vérifie si elle est en RGBA et si ce n'est pas le cas je modifie son buffer pour qu'elle le soit.

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 050
    Points
    7 050
    Par défaut
    Bon, j'ai modifié le chargement des textures pour rajouter une valeur alpha dans le buffer.

    Résultat :
    - Avec la première technique (GL_BLEND et masque), ça ne change rien.
    - Avec les deux autres techniques, le texte a complètement disparu.

    Il doit y avoir encore autre chose à faire.

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 475
    Points
    11 475
    Billets dans le blog
    11
    Par défaut
    Et tu as mis quoi comme valeur alpha pour ton image ? 0 pour chaque pixel ? Parce qu'il faut mettre 255 (unsigned char) si tu veux que le pixel apparaisse. donc pour les pixels de ton image correspondant aux lettres, l'alpha doit être à 255

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Pour expliciter la réponse à dragonjoker59.

    Le canal alpha représente ton niveau de transparence.
    C'est une image en niveau de gris. (Donc 1 UCHAR par pixel qui va de 0 à 255 (256 niveaux))
    (0 entièrement transparent - 255 entièrement opaque - 128 a moitié transparent)

  10. #10
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 050
    Points
    7 050
    Par défaut
    Bon, il y a un mieux :

    Mais, c'est pas encore parfait.
    Je creuse ...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Qu'utilise tu pour faire ton fenêtrage? Si tu utilise glut regarde:
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, string[j]);

    Je sais qu'il existe un equivalent en SFML, mais je ne me rappel plus ou je l'ai noté, pour SDL je ne sais pas.

    Belle soirée

  12. #12
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 050
    Points
    7 050
    Par défaut
    Bon, le coupable est le format JPEG. Il interprète les valeurs des couleurs pour en faire des approximations.
    Je suis passé avec des bitmaps, et c'est beaucoup mieux (sans être parfait).


    Citation Envoyé par Some0ne Voir le message
    Qu'utilise tu pour faire ton fenêtrage?
    Delphi (c'est bien la seule chose que je maîtrise).

    Citation Envoyé par Some0ne Voir le message
    Je sais qu'il existe un equivalent en SFML, mais je ne me rappel plus ou je l'ai noté, pour SDL je ne sais pas.
    C'est pour ceux qui développent en C++, j'imagine.

Discussions similaires

  1. Afficher un texte sur une vidéo
    Par arno2000 dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/01/2009, 10h08
  2. afficher du texte dans une nouvelle fenetre ?
    Par italiasky dans le forum MFC
    Réponses: 7
    Dernier message: 25/11/2008, 15h52
  3. Réponses: 6
    Dernier message: 14/06/2007, 12h13
  4. Réponses: 2
    Dernier message: 05/01/2006, 00h08
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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