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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Âge : 45
    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 705
    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 ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    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
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Âge : 45
    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 705
    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 ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Membre Expert
    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 : 46
    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
    Par défaut
    Bonjour,

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

  5. #5
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Âge : 45
    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 705
    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 ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  6. #6
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 035
    Billets dans le blog
    12
    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.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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, 11h08
  2. afficher du texte dans une nouvelle fenetre ?
    Par italiasky dans le forum MFC
    Réponses: 7
    Dernier message: 25/11/2008, 16h52
  3. Réponses: 6
    Dernier message: 14/06/2007, 13h13
  4. Réponses: 2
    Dernier message: 05/01/2006, 01h08
  5. Réponses: 2
    Dernier message: 10/06/2002, 12h03

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