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 :

problème pour déactiver/activer un simple Blending !!!!


Sujet :

OpenGL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut problème pour déactiver/activer un simple Blending !!!!
    HELLO WORLD !!

    J'ai 2 plans (1 partie 2D d'un cube => un simple quad)
    le premier doit être sans blending, mais le second, oui.

    1) au départ, j'initialise le blending à FALSE: glBlendFunc(GL_SRC_ALPHA,GL_ONE);

    2) OBJET 1, je n'active pas le blend:
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
    -> je crée mon objet 2 ici même
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);

    3) OBJET 2, j'active le blend:
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    -> je crée mon objet 2 ici même
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);

    4) swap_buffers() => affichage

    le résultat : les 2 sont transparents !!!!!!!!!!
    POURQUOI ????

    PS:
    - si j'active le blending pour le premier et pas pour le second, ca marche bien !!!!
    - si je n'active pas du tout le blending pour les 2 objets, c'est bon aussi.

    Avez-vous une idée?
    Merci encore.
    Séb.

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    qu'est-ce que tu veux dire par "les 2 sont transparents"?

    pour un pixel couvert par les 2 objets tu devrais avoir comme résultat:

    resultat.Couleur = (Objet2.Alpha*Objet2.Couleur) + Objet1.Couleur

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    lol. Bonjour.

    Je veux dire que les 2 plans dont je parlais sont transparents alors que j'ai configuré 1 sans blending et un autre AVEC blending.
    (et laisse tomber les formules de mélanges de couleurs, c'est géré par OpenGL. Enfin.... à part si tu souhaites modifier l'apparence du blending)

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    Je me suis écrit un petit test app qui fait à peu près la même chose que ton exemple et qui fonctionne correctement. Tu es certain que tu fais seulement ce qui est mentionné dans ton premier post? Le mélange des couleurs est géré par ton glBlendFunc.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut RE: PB Blending :?
    Salut.

    Peut-tu m'envoyer ce programme de test.
    (En tout cas la partie OpenGL)

    PS: J'ai peut être omis quelque chose.

    Merci.
    Séb.

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    Salut,

    Tient, voici mon 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
     
    void PreDraw(void)
    {
    	glClearColor(0,0,0,1);
    	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    }
     
    void Draw(void)
    {
    	glDisable(GL_DEPTH_TEST);
    	glBegin(GL_QUADS);
    		glColor4f(0,0,1,0.5);glVertex3f(-0.75,-0.75,0);
    		glColor4f(0,0,1,0.5);glVertex3f(-0.75,0.25,0);
    		glColor4f(0,0,1,0.5);glVertex3f(0.25,0.25,0);
    		glColor4f(0,0,1,0.5);glVertex3f(0.25,-0.75,0);
    	glEnd();
     
    	glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE/*_MINUS_SRC_ALPHA*/);
    	glBegin(GL_QUADS);
    		glColor4f(1,0,0,0.5);glVertex3f(-0.5,-0.5,0);
    		glColor4f(1,0,0,0.5);glVertex3f(-0.5,0.5,0);
    		glColor4f(1,0,0,0.5);glVertex3f(0.5,0.5,0);
    		glColor4f(1,0,0,0.5);glVertex3f(0.5,-0.5,0);
    	glEnd();
    	glDisable(GL_BLEND);
    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Salut gybe!

    J'ai testé ton code mais ca donne la même chose que moi:

    les 2 plaques 2D se fondent entres elles; il y a un mélange de couleurs.

    Toujours avec ton code j'ai placé celle NON transparente en premier et celle avec blending DESSOUS. Et même avec cette configuration là, les plaques se fondent entres elles !!

    POURQUOI ??

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par cyber_N
    Salut gybe!

    J'ai testé ton code mais ca donne la même chose que moi:

    les 2 plaques 2D se fondent entres elles; il y a un mélange de couleurs.

    Toujours avec ton code j'ai placé celle NON transparente en premier et celle avec blending DESSOUS. Et même avec cette configuration là, les plaques se fondent entres elles !!

    POURQUOI ??
    C'est normal qu'il y ait un mélange de couleur entre les 2 tuiles. Je blend un carré bleu avec un carré rouge, donc j'obtient un mélange de bleu et de rouge. Je ne suis pas certain de comprendre ce que tu t'attends de voir.

    Je dessine tout d'abord l'objet opaque et ensuite l'objet transparent. Il va toujours y avoir un blend entre les 2 même si je dessine l'objet transparent plus loin en Z, car je ne fais pas de depth test.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    OK!
    Mais alors comment procèdes-tu pour avoir une plaque transparente derrière une plaque NON transparente sans qu'il y ait un mélange de couleur....?

    imagine en réalité un mur d'épaisseur nulle et un mur vitré transparent donc juste derrière ce mur : il n'y a pas de mélange car le premier mur est opaque.

    comment t'aranges-tu pour obtenir cette situation?

    Merci encore.

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    active le depth test:

    glEnable(GL_DEPTH_TEST);

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    J'ai trouvé mais tu as été plus rapide que moi pour répondre !

    En fait il faut dessiner du fond vers nous pour pouvoir y arriver. Dit moi si je me trompe....

    existe t il une autre technique qui permet de dessiner indifféremment des objets transparents et d'autres non transparents en sachant qu'il faut conserver cette aspect OPAQUE et SANS MELANGES DE COULEURS pour les objets non transparents?

    merci encore.

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    Tu peux utiliser l'alpha to coverage, mais ça va te donner moins de niveau de transparence. C'est un sujet assez avancé qui utilise l'extension GL_ARB_multisample. Humus a écrit une démo sur le sujet récemment

    http://www.humus.ca/

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Bonjour.

    Ca c'est pour réaliser un effet masqué (masked), mais je sais pas si ca s'appliquerait à la transparence (l'effet masqué supprime certaines couleurs - couleur transparente - mais ne fait pas de fondu pour la transparence)

    Qu'en penses-tu ??

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    en dessinant un objet avec alpha to coverage, certain de ses échantillons seront rejettés en fonction de leur valeur en alpha. Ce qui fait que pour ces échantillons le depth ne sera pas updaté. Ainsi plus tard lorsque tu dessineras un objet opaque derrière l'objet transparent, les échantillons rejetés pour l'objet transparent pourront être occupés par ceux de l'objet opaque, ce qui va te donner un blend entre les 2 objets.

    Malheureusement tu vas avoir un moins bon blend de cette façon et tu sera obligé d'activer l'antialiasing. Si tu veux un blend de qualité tu vas devoir trier tes objets.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    GRRR!!

    Donc la seule technique consiste à dessiner du fond du décor vers soi (caméra) pour y parvenir .... Est-ce exacte ??

    Je ne sais pas comment les développeur de jeux s'y prennent pour remédier à ce problème embêtant, mais bon, s'il faut trier les objets et primitives par profondeur, allons y...

    Je veux être sûre car cela va influancer mon moteur 3D que je programme....

    merci encore.

  16. #16
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    D'après moi, dessiner tout du fond vers le devant te donnera un trop grand overdraw.

    Je ne sais pas vraiment comment les moteurs 3D sont conçu. Si tu veux trier tes objets, je suppose que ce que tu devrais faire serait de d'abord dessiner de devant vers derrière tes objets opaques pour minimiser l'overdraw et ensuite dessiner de derrière vers devant tes objets transparents pour effectuer le blending.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Euuuuh? c'est quoi un overdraw? de la latence ?

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Ok pour l'overdraw, je suis aller voir par hasard le post en dessous parlant du code source de Quake3 et j'ai eu l'explication.

    Par contre, pour le blending, j'ai essayé de dessiner toute la scène pour tous les objets opaques (donc de simples plaques 2D) et ensuite j'ai dessiné, du fond vers moi, tous les objets qui doivent avoir un effet de blending...
    le résultat est le même !! tous les objets se fondent dans la partie où ils se superposent.

    Par contre, si TOUS les objets (opaques & transparents) sont dessinés du fond vers nous, alors là, ca marche.

    Qu'en pensez-vous ??

  19. #19
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    as-tu activé le depth test?

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    ARF! C'est ce que j'avais oublié !!!!
    C'est clair que si on active le depth test, OpenGL classe automatiquement les pixels des objets par profondeur et donc ca marche, mais pour moi, l'erreur venait du fait que blending rimait avec depth test à OFF.

    Maitenant, j'ai vraiment pris conscience de ce que le depth test apporte!!

    Merci encore pour ton aide gybe, le sujet est résolu!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gros problèmes pour une requête pourtant simple
    Par VLorde dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/01/2015, 15h05
  2. Problème pour activer l'extension mhash
    Par Evocatii dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 10/08/2007, 14h36
  3. Problème debutant pour un formulaire tous simple
    Par legend dans le forum Langage
    Réponses: 5
    Dernier message: 24/04/2007, 22h17
  4. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32

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