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 :

masking avec alpha


Sujet :

OpenGL

  1. #1
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut gradient mask openGL
    Hello,

    j utlise le stencil test pour faire du masking sur une scene 2D

    mon code ressemble a celui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS,1,1);
    glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
    mask->Draw();
    glStencilFunc(GL_EQUAL,1,1);
    glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
    sprite->Draw();
    glDisable(GL_STENCIL_TEST);
    ca marche tres bien avec une texture avec des couleurs pleines et des zones transparentes mais avec une texture PNG et des zones avec un alpha modulés, les zones qui sont semi transparentes apparaissent pleines ;(

    j ai fait plusieurs test avec differents test alpha et de blending mais j ai rien trouvé qui corrige le probleme.

    Si qq un a une idée ?

    Merci d avance

  2. #2
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    personne ?

    j ai effectué pleins de tests mais sans succès, suivant les valeurs , soit j obtiens aucun dessin , soit c est le masque qui est dessiné , soit le sprite la ou le masque a un alpha > 0

    je veux reussir a obtenir sur les pixels ou le masque a un alpha > 0 && < 1 , un alpha de destination qui est égal à alpha_masque * alpha_sprite

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Salut,
    Le stencilBuffer comme tu dois le savoir, permet de faire une sorte de "masque", et toi, t'essaye de réaliser de l'alpha blending avec, ce qui est un temps soit peu incorrect.
    Pour aboutir à ce que tu souhaites (si j'ai bien compris) t'as deux solutions:
    1-Les shaders.
    2-L'alpha blending avec le FFP.

    Avec les shaders, il suffit d'activer l'alpha blending coté client et ça marche tout seul.
    Parcontre, avec le FFP, c'est un poil different, bon, puisque t'es en 2D, le tri des faces n'importe pas, donc, t'as un travail en moins, donc, il suffit que t'appel ça avant le dessin de ton polygon avec la texture png:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    et après le rendu:
    Voila, en esperant t'avoir aidé.

  4. #4
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Hello,

    en fait je cherche un faire un masque qui utilise un facteur alpha

    ca reste un masque dans le sens ou les pixels ayant un alpha == 0 ne seront pas pris en compte.

    mais car contre l effet est progressif, si un pixel du masque a un alpha de 0.5, alors le resultat sera 0.5*pixel_derriere + 0.5 * (pixel_sprite*alpha_sprite)

    en en discuttant tout a l heure avec les graphistes/flasheurs de mon equipe, ils n ont dis que c etais possible en actionscript3

    et en effet, apres quelque recherche sur "grandient mask as3" je tombe pilepoil sur ce que je veux faire.

    http://www.devx.com/webdev/Article/29296#codeitemarea

    ca me parrait donc gros qu opengl ne propose pas ceci sans shader (je suis sur un projet 2d qui dois tourner sur des config relativement modestes)

    en pj , l exemple de ce que je veux faire tiré de l exemple AS3

    dans la pratique , je veux utiliser des particules ayant un facteur alpha comme masque pour un effet bien précis.
    Images attachées Images attachées  

  5. #5
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Pour faire ça, pas besoin de stencil buffer. Seul le blending alpha sera utile. Donc la texture que tu cales dessus doit avoir une couche alpha, ou tu dois en générer une à la volée et l'intégrer à la texture avant la création de la texture au format opengl.

  6. #6
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut gradient mask openGL
    l image en PJ etait la pour montrer le rendu visuel mais le masque a une taille, une position et une texture variable et je voudrais utiliser de nombreux elements comme masque , comme par exemple des particules

    je vois pas comment ca serait possible avec juste un effet d alpha..

  7. #7
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Et ? Tu généres le masque dynamiquement et zou. Les stencil ne sont pas fait pour ça, l'alpha blending, oui.

  8. #8
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Et ?
    code/pseudo code d exemple si possible, ca serait cool , car si je pose sur le forum, c est que j ai du mal a résoudre mon problème ..

    j ai faut cherche sur le net , je trouve pas de code de gradient mask en openGL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tu généres le masque dynamiquement et zou
    comment ? glReadPixels ? mon masque et mon sprite ont une taille , position et coordonnées de textures que je ne connais pas a l avance.

    je dois générer une nouvelle couche alpha par frame ? ca risque d être un peu couteux non ?



    reprenons l exemple que j ai mis au premier post :


    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS,1,1);
    glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
    mask->Draw();
    glStencilFunc(GL_EQUAL,1,1);
    glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
    sprite->Draw();
    glDisable(GL_STENCIL_TEST);
    sachant que mask et sprite sont des objet "drawable" dans le moteur et que c est donc potentiellement : un quad texturé, plusieurs quads texturé , un ensemble de particules..

    je précise une nouvelle fois que ce code marche tres bien, si ce n est que le test stencil fonctionne parfaitement si alpha > 0 .

  9. #9
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Surtout pas glReadPixels, c'est un trou à performances

    Le principe serait bien de retoucher la couche alpha à chaque frame (ou plus exactement : à chaque fois que c'est nécessaire). Pour le fait d'être trop couteux, la seule réponse possible est "ça dépend". On ne connais pas la taille de la texture à modifier ni le nombre de masques différents que tu veux générer simultanément et encore moins la complexité du masque.

    En gros:
    1. tu rends ta scène sans te préoccuper du masque
    2. tu modifies la couche alpha d'une texture (pré-allouée, qui est remplie avec ce qui sert de fond ou de front, je sais pas dans quel sens tu veux appliquer ta modif)
    3. tu rends la texture modifiée en 2. dans un quad 2D qui prend tout l'écran en désactivant le test et l'écriture dans le Z buffer

  10. #10
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    ok je vois la technique

    ayant deja fait des techniques similaires avec pour des effects de blur (render to texture) j ai peur que ca soit trop couteux.

    en effet je fais ca sur une partie de l ecran ou du fullscreen et souvent avec des particules.

    Je ne connais pas le détail du code d implémentation du stencil buffer en OpenGL, mais j ai du mal a comprendre pourquoi le stencil buffer ne peut pas effectuer cette opération en fait

    vu qu il est capable de trouver si l alpha est 0 ou non, et de fournir une condition booléenne pour l affichage d un pixel ou non, pourquoi ne pourrait il pas fournir une valeur qui permette de moduler l affichage du pixel de destination.

    sinon est que ca existe dans d autres api comme DirectX ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/04/2010, 23h43
  2. Perte du mask avec MaskedTexBox
    Par Kropernic dans le forum Windows Forms
    Réponses: 21
    Dernier message: 09/03/2010, 12h09
  3. Problème avec alpha dans un clip
    Par Buuhh dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 08/01/2009, 22h00
  4. Réponses: 0
    Dernier message: 11/05/2008, 22h09
  5. [FLASH 8] Faire disparaitre du texte avec alpha
    Par steeves5 dans le forum Flash
    Réponses: 6
    Dernier message: 08/06/2006, 15h47

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