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 :

glsl pixel précédent dans le fragment shader


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut glsl pixel précédent dans le fragment shader
    Bonsoir,
    Deux questions, proches, premièrement quelle est la manière correcte de gérer la transparance en OpenGL forward-compatible, est-ce de mettre une valeur d'alpha entre 0 et 1 pour la couleur en sortie du fragment shader, et paramétrer les choses comme avant en dehors du shader ? ou bien faut-il récupérer la valeur précédente du pixel et faire le mix dans le fragment shader ?

    Ma deuxième question est (même dans le cas ou la première réponse serait d'utiliser l'alpha) comment dans le fragment shader (jutilise actuellement GLSL 1.30 et 1.20) récupérer la valeur précédente du pixel ? (par exemple pour faire des mix perso autre que de la transparance)

  2. #2
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Salut,

    Pour ta première question, les deux méthodes sont possibles.
    La première avec les commandes glEnable(GL_BLEND), glBlendFunc, glAlphaFunc qui fera le mélange en fonction de la valeur alpha de tes pixels en sortie de ton fragment shader. Inconvénient comme tu le cites l'ordre de dessin des objets à son importance.
    Ou 2ème méthode tu mélanges toi même tes pixels dans ton fragment shader.

    Pour ta deuxième question, pour pouvoir récupérer la valeur précédente d'un pixel il faut utiliser les FBO (Frame buffer object). En faite tu stockes l'ensemble de ta scène dans une(des) texture(s) (stockage colormap et (ou) depthmap si ta surface transparente est derrière tu ne fais pas le mélange couleur), ce qui te permet par la suite de l'utiliser dans ton fragment shader.

    Petit exemple : tu dessines l'ensemble de ta scènes ne contenant aucun objet transparent que tu sauvegardes dans un FBO. Deuxième passage, tu dessines tous les objets transparents en les mélangeants avec les pixels concernés.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    uniform sampler2D fboColorMap;
    void main()
    {
         vec2 coordPixel = gl_Position;/*il y a une transformation a faire pour correspondre aux coordonnées texture à voir sur le net*/
         vec3 pixelColor  = texture2D(fboColorMap, coordPixel);
     
          gl_FragColor = pixelColor*0.5f+gl_FrontColor*0.5f; /*mélange équilibré*/
     
          /*tu peux aussi utiliser la composante alpha*/
          float alpha = gl_FrontColor.a;
          gl_FragColor = pixelColor*(1-alpha)+gl_FrontColor*alpha;
    }
    Il y a surement d'autre solution, tout dépend de ce que tu cherches à faire.

    L'avantage de la deuxième méthode c'est que tu peux simuler la réfraction d'une surface comme quand tu regardes à travers une vitre déformée.
    De mémoire c'est similaire aux méthodes de bump mapping mais au lieu d'avoir une texture quelconque c'est ta scène enregistrée dans un FBO que tu déformes à l'aide d'un effet similaire au bump mapping.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut
    utiliser un FBO me parrait compliqué, n'est-il vraiement pas possible de récupérer le pixel précédent plus simplement dans le fragment shader ?
    (mais c'est vrai que j'ai relu les specs 2 fois, et je n'ai effectivement pas trouvé)

    D'autre part glAlphaFunc a l'air d'être une fonction obsolète, que doit-on utiliser à la place ?

  4. #4
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Malheureusement, je ne crois pas qu'il y aie d'autres solutions que les FBO pour récupérer la valeur d'un pixel précédent.

    glAlphaFunc a effectivement de forte chance d'être obsolète avec la Opengl 3.1+ à confirmer avec la doc.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 66
    Par défaut
    Bonjour,

    Avec cette technique on pourrai facilement faire du motion blur non?

  6. #6
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Salut Baton,

    Oui effectivement pour le Montion blur de mémoire c'est aussi des FBO qu'il faut utiliser. Il y a plein d'info sur les moteurs de recherche pour le Montion blur et Opengl.

    De toute façon, tout post traitement (ex:Motion blur) requière quasiment tout le temps des FBO vu qu'un post traitement comme son nom l'indique est effectué sur le traitement déjà calculer, donc ici le rendu de la scène qui est sauvegardé sur un ou plusieurs FBO.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/12/2014, 09h48
  2. Réponses: 3
    Dernier message: 14/12/2010, 19h35
  3. [GLSL] Texture2D dans un fragment shader
    Par GloW_on_dub dans le forum OpenGL
    Réponses: 7
    Dernier message: 12/04/2010, 15h50
  4. [GLSL]utiliser des textures dans un vertex shader
    Par delfare dans le forum OpenGL
    Réponses: 14
    Dernier message: 04/10/2007, 10h31
  5. Pixels adjacents dans pixel shader
    Par ultimanu dans le forum DirectX
    Réponses: 5
    Dernier message: 24/04/2007, 13h31

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