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 :

Copie de buffer avec FBO


Sujet :

OpenGL

  1. #1
    Membre du Club Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Points : 57
    Points
    57
    Par défaut Copie de buffer avec FBO
    Bonjour,

    J'utilise difficilement OpenGL mais je veux réaliser quelque chose qui n'a pas l'air sorcier.

    Je voudrais dessiner une scène off-screen avec des primitives (beaucoup) sans textures.
    Une fois cette scène créée, je voudrais la sauvegarder à un autre endroit dans la mémoire de la carte graphique.
    Ensuite, je continue sur la 1ère scène avec des primitives avec textures.
    Une fois terminée, j'affiche à l'écran la scène.

    A la seconde image, je récupère une partie de la scène sauvegardé (avec éventuellement un décalage) que je complète que je sauvegarde...


    Avant les FBO, j'utilisais le buffer GL_AUX0 comme zone de sauvegarde et la commande glcopypixels. Ca marchait bien mais avec mon nouveau PC je n'ai plus de buffer GL_AUX0 et il semblerait que l'utilisation de FBO soit maintenant la norme.

    Voilà si quelqu'un peut me donner une piste (ou même un peu plus), je lui en serais très reconnaissant.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour le moment, je ne peux que vous conseiller cette article : http://www.songho.ca/opengl/gl_fbo.html
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Pour le moment, je ne peux que vous conseiller cette article : http://www.songho.ca/opengl/gl_fbo.html
    Oui je l'avais trouvé. D'ailleurs je trouve bien dommage que ces exemples de code ne soient pas libre de droit. Ce sont un peu des pièges, ce genre de site.

    Bon j'ai finalement réussi à faire se que je vous voulais. Je pense comprendre un peu mieux comment marche un FBO.

    Donc :

    Je créée un FBO.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GLuint fbu;
    glGenFramebuffersEXT(1, &fbu);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbu);
    Je crée un RenderBuffer que je lie à mon FBO.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    GLuint color_fbu;
    glGenRenderbuffersEXT(1, &color_fbu);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, color_fbu);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, PIXEL_FORMAT, WIDTH, HEIGHT);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, color_fbu);
    Je dessine le début de ma scène dans le buffer écran (celui correspondant au backbuffer).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    //draw
    Je copie ma scène dans le FBO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
    glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbu);
    glBlitFramebuffer(0, 0, WIDTH, HEIGHT, 0, 0, WIDTH, HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);
    Je continue ma scène :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    //draw
    A l'image suivante, je copie le contenu du buffer sauvé dans le buffer écran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fbu);
    glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
    glBlitFramebuffer(0, 0, WIDTH, HEIGHT, 0, 0, WIDTH, HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);
    et je continue ma scène...


    En résumé :
    Dans mon cas (et si j'ai bien compris c'est le but des FBO), les FBO servent à faire du rendu hors-écran.
    Un FBO doit avoir un renderbuffer (ou un texturebuffer) attaché à la couleur.
    Un FBO peut aussi avoir d'autre buffer pour le depth et le stencil et aussi d'autre buffer couleur (et là j'ai pas compris l'intérêt).
    Après il y a des opérations que l'on peut faire entre FBO et buffer écran.

    Voilà une petite explication pour ceux qui (comme moi) n'avait rien compris au FBO.

    S'il y a d'autres raffinements sur les FBO (notamment sur mon opération de blit) ou si je raconte que des conneries, n'hésitez pas...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Je doute qu'il y ai besoin des glBlitFrameBuffer(). En effet, si un FBO est actif lors du dessin de la scène, alors la scène sera dessinée dans ce FBO.

    Dans mon cas (et si j'ai bien compris c'est le but des FBO), les FBO servent à faire du rendu hors-écran.
    Oui

    Un FBO doit avoir un renderbuffer (ou un texturebuffer) attaché à la couleur.
    Oui, si on dessine des couleurs (je veux dire, je ne suis pas sur que cela soit obligatoire )

    Un FBO peut aussi avoir d'autre buffer pour le depth et le stencil et aussi d'autre buffer couleur (et là j'ai pas compris l'intérêt).
    L'intérêt ? Bah, par exemple, vous voulez garder votre depth buffer pour faire du shadow mapping, ou le stencil car vous avez écrit des informations dedans et que vous voulez les garder.
    Après il y a des opérations que l'on peut faire entre FBO et buffer écran.
    Oui, en faisant des rendu vers texture (grace à un FBO) puis en utilisant ces textures comme source du rendu finale (par exemple).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je doute qu'il y ai besoin des glBlitFrameBuffer(). En effet, si un FBO est actif lors du dessin de la scène, alors la scène sera dessinée dans ce FBO.
    Mais dans ce cas, je devrais quand même blitter vers le buffer écran. Soit je dessine dans le buffer écran et je blitte vers un FBO, soit je dessine dans le FBO et je blitte vers le buffer écran ou alors j'ai râté quelque chose.

    Citation Envoyé par LittleWhite Voir le message
    Oui, si on dessine des couleurs (je veux dire, je ne suis pas sur que cela soit obligatoire )
    Il semblerait qu'un attachement vers un buffer de couleur soit obligatoire.

    Citation Envoyé par LittleWhite Voir le message
    L'intérêt ? Bah, par exemple, vous voulez garder votre depth buffer pour faire du shadow mapping, ou le stencil car vous avez écrit des informations dedans et que vous voulez les garder.
    Oui, en faisant des rendu vers texture (grace à un FBO) puis en utilisant ces textures comme source du rendu finale (par exemple).
    Oui ça c'est ok. C'était l'intérêt d'avoir plusieurs buffers de couleurs que je ne comprenais pas.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Mais dans ce cas, je devrais quand même blitter vers le buffer écran. Soit je dessine dans le buffer écran et je blitte vers un FBO, soit je dessine dans le FBO et je blitte vers le buffer écran ou alors j'ai râté quelque chose.
    Dans le suite de commandes suivantes :
    bind (FBO)
    draw (array ou buffer)
    La scène sera dessinée dans le FBO.
    Si vous voulez la blitter sur l'écran, vous pouvez soit faire une copie du FBO vers l'écran avec le glBlitFrameBuffer, soit, si vous avez fait un rendu dans une texture, faire un rendu d'un quad de l'écran avec application de la texture.
    Ce que je voulais dire, c'est que le glBlitFrameBuffer n'est pas obligatoire.
    Car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
    glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbu);
    glBlitFramebuffer(0, 0, WIDTH, HEIGHT, 0, 0, WIDTH, HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);
    Copie l'image de l'écran vers un FBO, ce qui semble bizarre

    Oui ça c'est ok. C'était l'intérêt d'avoir plusieurs buffers de couleurs que je ne comprenais pas.
    Maintenant, cela peut être utile, afin de récupérer les position des géométris, les normales et les couleurs de la scène pour tout avoir dans les textures (voir les techniques defered shading).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découpage buffer avec sscanf
    Par sorry60 dans le forum C
    Réponses: 4
    Dernier message: 07/12/2005, 17h41
  2. [XSL] copy-of select avec un "|" possible?
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 23/11/2005, 09h51
  3. Réponses: 3
    Dernier message: 19/10/2005, 15h58
  4. Réponses: 4
    Dernier message: 14/01/2005, 19h41
  5. Copie de CD avec k3b
    Par -PiKo- dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 08/08/2003, 13h58

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