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 :

OpenGL copier renderbuffer sur framebuffer


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut OpenGL copier renderbuffer sur framebuffer
    Bonjour à tous,

    Je code actuellement un programme OpenGL où j'aurais besoin de faire un premier rendu dans un renderbuffer, traiter l'image et ensuite l'afficher dans le framebuffer à l'écran.

    Le code que j'utilise est le suivant, pour l'init des buffers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    glGenRenderbuffers(1, &renderBuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, SCREEN_WIDTH, SCREEN_HEIGHT);
     
        glGenFramebuffers(1, &fbo);
        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
     
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer);
     
        int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
        if(status != GL_FRAMEBUFFER_COMPLETE)
        {
            fprintf(stderr, "Can't complete Framebuffer\n");
        }
    Et ensuite pour l'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
    25
    26
    27
    28
    29
    30
        glClear(GL_COLOR_BUFFER_BIT);
     
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     
        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
     
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
     
        // DRAW
        /*............................*/
     
        GLvoid* pixels;
        pixels = new GLvoid*[SCREEN_WIDTH][SCREEN_HEIGHT][4];
        //GLvoid* pixels[SCREEN_WIDTH][SCREEN_HEIGHT][4];
        glPixelStoref(GL_UNPACK_ALIGNMENT, 1);
        glReadBuffer(GL_COLOR_ATTACHMENT0);
        glReadPixels(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGBA, GL_FLOAT, pixels);
     
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glEnable(GL_ALPHA_TEST);
        glAlphaFunc(GL_GREATER, 0.5);
        glRasterPos2d(0, 0);
        glDrawPixels(SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGBA, GL_FLOAT, pixels);
     
        glFlush();
        SDL_GL_SwapBuffers();
     
        glDisable(GL_BLEND);
    J'obtiens un écran noir. La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        pixels = new GLvoid*[SCREEN_WIDTH][SCREEN_HEIGHT][4];
    semble faire planter le programme.

    Y aurait il des initiés à OpenGL qui pourraient m'expliquer la procédure pour les framebuffer object et renderbuffer ?

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    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 033
    Billets dans le blog
    12
    Par défaut
    Je ne vois rien de problématique dans la création de ton fbo et de ton rbo.

    Tu dis que la ligne [...] fait planter ton programme ? Comment fais-tu alors pour avoir un rendu noir ?
    Peux-tu expliciter cette partie de ton problème ?

    PS :
    Utilise la balise [ code ]...[ /code ] pour encadrer ton code et le rendre plus lisible s'il te plaît (tu peux éditer ton post initial).
    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).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Alors au départ je ne faisais pas de tableau de GLvoid. J'ai trouvé cette méthode en me documentant sur l'utilisation des renderbuffers. C'est peut etre inutile. Ce qui me parait étrange c'est le fait de stocker un tableau de pixels dans la mémoire. En théorie l'avantage d'utiliser un renderbuffer et que les infos restent dans la mémoire de la carte graphique.

    Donc avant de faire un tableau de GLvoid, d'utiliser glReadPixels et glDrawPixels je faisait un glBlitFramebuffer et j'avais un écran noir.

    Je ne comprends pas quel est le bon ordre et les bonnes fonctions OpenGL à appeler pour utiliser un renderbuffer. Je voudrais simplement faire le rendu dans un renderbuffer et afficher le tout à l'écran (sur le framebuffer) en faisant un Alpha_Test.

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    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 033
    Billets dans le blog
    12
    Par défaut
    Tu ferais mieux d'en rester au glBlitFrameBuffer, par contre il faut activer ton frame buffer source en read et le frame buffer destination (ici celui de l'écran donc 0) en draw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glBindFrameBuffer( GL_READ_FRAMEBUFFER, fbo );
    glBindFrameBuffer( GL_DRAW_FRAMEBUFFER, 0 );
    glBlitFrameBuffer( srcLeft, srcTop, srcRight, srcBottom, dstLeft, dstTop, dstRight, dstBottom, mask, filter );
    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).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Ok c'est noté. Mais comment agencer les fonctions dans une boucle draw ?

    Je fais la boucle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    glClearColor(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     
    glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
     
    // Boucle d'affichage (vertex etc...) C'est une scene en 2D //
     
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    // J'aimerais faire un alpha test ici //
    glBlitFramebuffer(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);
     
    glFLush();
    SDL_GL_SwapBuffers();
    Ce code me donne une image figée de la première scène rendue. Je ne comprends pas ce qui cloche et je ne trouve pas d'exemple d'implémentation de l'utilisation que je veux faire du renderbuffer.

    J'ai compris le principe mais comment faire ?

    Merci en tout cas

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    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 033
    Billets dans le blog
    12
    Par défaut
    En fait ça marche en 2 temps :
    Rendu de la scène dans to FBO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Activation de ton FBO en tant que cible des rendus qui vont suivre
    glBindFrameBuffer( GL_DRAW_FRAMEBUFFER, fbo );
    // Dessin de la scène
     
    ...
    Puis rendu de ton FBO dans le buffer de l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Activation de ton FBO en source
    glBindFrameBuffer( GL_READ_FRAMEBUFFER, fbo );
    // Activation du buffer de l'écran en destination
    glBindFrameBuffer( GL_DRAW_FRAMEBUFFER, 0 );
    // Stretch blit de source dans destination
    glBlitFrameBuffer( srcLeft, srcTop, srcRight, srcBottom, dstLeft, dstTop, dstRight, dstBottom, mask, filter );
    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).

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 16/03/2006, 16h44
  2. Réponses: 7
    Dernier message: 15/02/2006, 15h12
  3. Réponses: 3
    Dernier message: 05/11/2005, 14h35
  4. [OpenGL/C++] Opérations sur les Textures
    Par Bob.Killer dans le forum OpenGL
    Réponses: 6
    Dernier message: 10/08/2005, 10h27
  5. [OPENGL/C++] Couleur sur un DWORD ?
    Par Bob.Killer dans le forum OpenGL
    Réponses: 7
    Dernier message: 15/04/2005, 14h20

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