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 :

FrameBuffer - image vide


Sujet :

OpenGL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut FrameBuffer - image vide
    Salut à tous,
    J'ai un problème lors de l'utilisation d'un framebuffer, la texture générée par le framebuffer est vide, ou noire. J'ai pourtant suivit à la lettre plusieurs tutoriel, et observé les codes de la plus parte des samples qu'on trouve sur le net, qui eux fonctionnent. Quand je ne bind pas le framebuffer pour voir ce que c'est censé faire, mon rendu fonctionne, mais dès que je le met dans le framebuffer, ma texture apparait noire. Je précise que j'ai bien les shader et les framebuffer disponible.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    // Initialisation
    int width = 800;
    int height = 600;
     
    GLuint fbo;
    GLuint tex;
    GLuint dbo;
     
     
    // DepthBuffer
    glGenRenderbuffersEXT(1, &dbo);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, dbo);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
     
    // Texture
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glBindTexture(GL_TEXTURE_2D, 0);
     
    // FrameBuffer
    glGenFramebuffersEXT(1, &fbo);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
     
    // Binds
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, dbo);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);  
     
    if (status == GL_FRAMEBUFFER_COMPLETE_EXT)
           printf("FrameBuffer cree avec succes");
     
     
    // Dans la boucle d'affichage :
     
    // Réinitialisation des matrices pour le frambuffer
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
     
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(Position.x, Position.y, Position.z, Target.x, Target.y, Target.z, 0, 1, 0 );
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90, 800.0/600.0, 0.1, 1000);
     
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     
     
    glPushAttrib(GL_VIEWPORT_BIT);
    glViewport(0,0,width, height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    RadialPrg.Use(); // Juste un simple program GLSL
           // Ci-dessous, un simple rendu
           glColor3f(255, 255 ,255);
           Sky.DrawSun(Camera);
           glColor3f(0,0,0);
           Terrain.Draw();
           Scene.Draw();
    srl::Program::DUse();
     
    glPopAttrib();
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
     
    // Un autre rendu qui utilise la texture du framebuffer
    // Réinitialisation des matrices pour le rendu
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(Position.x, Position.y, Position.z, Target.x, Target.y, Target.z, 0, 1, 0 );
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90, 800.0/600.0, 0.1, 1000);
     
           glBindTexture(GL_TEXTURE_2D, tex);
           for (int i = 0; i < 4; i++) {
              glBegin(GL_QUADS);
              glTexCoord2d(0,1);
              glVertex3d(1,1,1);
              glTexCoord2d(0,0);
              glVertex3d(1,1,-1);
              glTexCoord2d(1,0);
              glVertex3d(-1,1,-1);
              glTexCoord2d(1,1);
              glVertex3d(-1,1,1);
              glEnd();
              glRotated(90,0,0,1);
           }
    Merci d'avance,
    A toute

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Utilises-tu des shaders pour rendre ta texture ou pas? Sinon, assures-toi bien de glEnable(GL_TEXTURE_2D) avant de faire le rendu de la texture...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Oui j'utilise des shader pour rendre la texture, mais le coté rendu marche parfaitement, j'ai mis 4 face pour simplifier mon code, mais sa reviens au même, glEnable(GL_TEXTURE_2D); et toutes les textures se rendent correctement sauf celle du framebuffer.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Tu dois mettre ton bind de frame buffer avant gluLookAt et glViewport

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Merci mais sa ne marche pas, toujours une texture noire

  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
    Coucou,

    Je dirais que tu dessines dans la mauvaise pile de matrice à première vue.

    Dans la configuration de ton buffer tu fais


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(Position.x, Position.y, Position.z, Target.x, Target.y, Target.z, 0, 1, 0 );
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90, 800.0/600.0, 0.1, 1000);
     
    //ton shader
    En gros ta dernière pile de matrice appelée est la pile de matrices de projection. Je pense qu'il faut repassé sur la pile de matrice modelview avant de dessiner dans ton buffer ou inverser l'initialisation des deux piles de matrices dans le code précédent tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
     
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90, 800.0/600.0, 0.1, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(Position.x, Position.y, Position.z, Target.x, Target.y, Target.z, 0, 1, 0 );
    //ton shader
    Si tu restes sur la matrice de projection en dernier, tes appels à glRotatef, glTranslatef et autres transformation lors des dessins de tes objets se feront sur ta matrice de projection et non sur ta scène qui est manipulée par la matrice de modelview

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    J'ai changé mais sa fait toujours pareil,
    merci quand même.

  8. #8
    Invité
    Invité(e)
    Par défaut
    SRL Killing, quelle est ta carte graphique ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tu peux essayer:
    - de mettre GL_NEAREST ou GL_LINEAR pour les filtres GL_MAG_FILTER et GL_MAX_FILTER (sinon sur certaines NVIDIA les samplers renvoient 0)
    - de rendre dans une texture POT2 (genre 1024x1024) (si ATI pas HD machin)

    Sais tu à 100% si c'est le render-to-texture qui ne marche pas ou ton affichage de texture qui suit ?

    Si tu remplis ta texture avec du blanc (glTexImage2D), est-ce que tu vois toujours du noir en l'affichant ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par TanEk Voir le message
    Utilises-tu des shaders pour rendre ta texture ou pas? Sinon, assures-toi bien de glEnable(GL_TEXTURE_2D) avant de faire le rendu de la texture...
    Même avec des shaders, les ATI nécessitent des fois cet appel à glEnable(GL_TEXTURE_xx)...

  11. #11
    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
    Coucou,

    Encore moi, j'ai peut être une autre piste

    Dans ton code tu as les deux lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, dbo);
    Donc en gros tu as attaché une texture à ton buffer par glFramebufferTexture2DEXT, or ton buffer est vide et est rattaché à aucun espace mémoire donc la texture rattachée à ton buffer pointe vers aucun espace mémoire.

    L'espace mémoire que tu attaches à ton buffer viens après avec glFramebufferRenderbufferEXT.

    Essaies d'inverser les deux lignes, attache d'abord l'espace mémoire pour ton buffer avec glFramebufferRenderbufferEXT, et ensuite attache une texture à ton buffer (plus exactement à l'espace mémoire) avec glFramebufferTexture2DEXT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, dbo);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
    En espérant que ce soit ça.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Alors j'ai une NVidia 9800 GT avec les drivers à jour. Les samples qui utilise cette technique marche mais quand j'essais de la reproduire sa ne marche pas, donc je comprend pas.
    Le rendu fonctionne parfaitement puisque sur 2 texture, une est affiché (chargée depuis un png) et celle du FBO ne marche pas, alors qu'elles utilise la même technique.

    J'ai aussi essayer d'inverser l'appel de glFrameBufferTexture et glFrameBufferRenderBuffer, sans résultat hélas.

  13. #13
    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
    Question bête, on sait jamais.

    Avez vous bien initialisée les fonctions extensions opengl utilisées, avec une lib (glew par ex) ou à la main.

    Enfin je pense que oui si non ca ne compilerait pas et/ou l'application cracherait au lancement.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Effectivement, je l'ai bien initialiser sinon sa n'aurait pas compiler, ou sa aurait crier au lancement, hors la le rendu est niquel à 600 fps.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Oulala...

    Quand tu fais le rendu en deux fois, tu ne dois pas avoir la même matrice de projection la deuxième fois, vu que tu veux juste afficher ta texture offscreen (donc ni avec une matrice de perspective ni avec une matrice de camera).


    Essaies avec un code genre :

    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
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D, tex);
     
     
    glBegin(GL_QUADS);
      glTexCoord2d(0,1);
      glVertex2d(-1, 1);
      glTexCoord2d(0,0);
      glVertex2d(1, 1);
      glTexCoord2d(1,0);
      glVertex2d(1, -1);
      glTexCoord2d(1,1);
      glVertex2d(-1, -1);
    glEnd();

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SRL Killing Voir le message
    Effectivement, je l'ai bien initialisé sinon ça n'aurait pas compilé, ou ça aurait crié au lancement, hors là, le rendu est nickel à 600 fps.

  17. #17
    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
    Euh, je suis un peu à court d'idée.

    Pouvez vous poster votre code en entier svp. Pour voir ce que ça donne chez moi.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Euuhhh Ponce.... sois j'ai rien compris, sois tu as dit n'importe quoi.
    Si je n'utilise pas les matrices sa fausse tout mon rendu... j'utilise quand meme une camera et tout pour mon vraie rendu, donc je doit utiliser les matrices. (enfin c'est plus pratique)

    Je ne cherche pas à faire un rendu off-screen, mais un rendu normal sauf qu'il utilise des shader particulier auquel je veut passer le rendu de la scene sous une autre forme.
    Donc je créer un framebuffer et tout ce qui va avec, je fait un premier rendu dans le framebuffer avec un program spécial, puis je fait un vrai rendu avec un program auquel j'ai passé la texture du framebuffer.

    Explique toi mieux s'il te plait.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Si tu utilises un FBO c'est pour faire du rendu "offscreen" (ou "render-to-texture"). OK ?

    Je me base sur le code que tu as posté.

    Euuhhh Ponce.... sois j'ai rien compris, sois tu as dit n'importe quoi.
    Si je n'utilise pas les matrices sa fausse tout mon rendu... j'utilise quand meme une camera et tout pour mon vraie rendu, donc je doit utiliser les matrices. (enfin c'est plus pratique)
    Oui c'est pour ca que j'ai mis
    tu ne dois pas avoir la même matrice de projection la deuxième fois
    mais lors de ton premier rendu (ie: dans la texture bindée au FBO) c'est bon.


    Je parle du code qui est en dessous de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Un autre rendu qui utilise la texture du framebuffer
    // Réinitialisation des matrices pour le rendu
    Lis mieux s'il te plait.


    (en même temps c'est pas très clair ce que tu veux faire non plus)

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Je ne comprend toujours pas, pourquoi je ne devrait pas avoir la même matrice de projection ?
    Et pourquoi une matrice vide pour le rendu que l'on est censé voir, alors qu'il utilise justement beaucoup de matrices ?

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

Discussions similaires

  1. Image par défaut si champs image vide
    Par AurelienNF dans le forum Langage
    Réponses: 4
    Dernier message: 24/08/2010, 00h37
  2. DBD::Chart::Plot me crée un fichier image vide
    Par ALLMAG54 dans le forum Modules
    Réponses: 7
    Dernier message: 15/05/2008, 19h44
  3. [newbie]Image vide dans movieClip
    Par Dsphinx dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 20/06/2007, 14h22
  4. savepicture >image vide
    Par stcly dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 10/05/2007, 14h10
  5. [VB.NET]Charger une "image vide" dans une picturebox
    Par mustang-f27 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/11/2006, 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