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 object : fonctionne pas


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut framebuffer object : fonctionne pas
    Hello.

    J'aimerais pouvoir utiliser les framebuffer object (FBO) avec un stencil buffer mais je me retrouve avec cette erreur : GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT.

    Mon code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    //attach texture
    glBindTexture (GL_TEXTURE_2D, tex_color);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,  width, height, 0, GL_RGBA, GL_INT, NULL);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex_color, 0);
    //depthstencil
    glBindTexture(GL_TEXTURE_2D, tex_depthstencil);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, width, height, 0, GL_RGBA, GL_INT, NULL);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, tex_depthstencil, 0);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, tex_depthstencil, 0);
    Merci

  2. #2
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Salut,

    Si tu veux juste ajouter un stencil buffer à ton FBO, il te suffit de faire ceci :

    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
    GLuint rbuffer;
    /* ici on suppose qu'on a déjà un framebuffer nommé 'fbo' */
     
    /* on génère un render buffer */
    glGenRenderbuffersEXT(1, &rbuffer);
     
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rbuffer);
    /* on défini sa taille */
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX8_EXT, width, height);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
     
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    /* on l'attache au FBO */
    glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
                              GL_RENDERBUFFER_EXT, rbuffer);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
    /* fini */
    Après si tu veux réellement créer une texture qui contiendra les données de profondeur avec les données stencil ben euh... Je ne vois pas en quoi ton code est mauvais... pourrais-tu nous donner une plus grosse portion de code ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Merci pour ta réponse, j'ai essayé ton code et j'ai toujours la même erreur

    Voici le code que j'exécute qu'une fois à l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //fbo
    glGenFramebuffersEXT(1, &fbo);
     
    //texture
    glGenTextures(1, &texID);
    glBindTexture (GL_TEXTURE_2D, texID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glBindTexture (GL_TEXTURE_2D, 0);
     
    //stencil
    glGenRenderbuffersEXT(1, &rbuffer);
    Voici le code que j'exécute à chaque resize de la fenêtre :
    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
    //texture
    glBindTexture (GL_TEXTURE_2D, texID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glBindTexture (GL_TEXTURE_2D, 0);
     
    //stencil
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rbuffer);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX8_EXT, width, height);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
     
    //attache texture et stencil au fbo
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texID, 0);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rbuffer);
     
    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    if(status==GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT)
      std::cout<<"erreur"<<std::endl;

  4. #4
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    En fait le code que je t'ai proposé est à exécuter à l'initialisation. Il a pour effet d'attacher un render buffer de type stencil à un FBO. Après, une fois qu'il est attaché, plus besoin d'y toucher, même pour le redimensionner (enfin je pense).
    À propos du code que tu me montres, il y a deux choses qui m'ont fait tilter :
    - Tu pourrais rajouter un glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); après l'ajout à ton FBO de son render buffer et sa texture ;
    - Tu sembles vouloir récupérer les informations de couleur dans une texture ; je te conseille l'utilisation d'un depth buffer, sinon tu vas avoir des surprises dans ta texture

    En gros, on pourrait schématiser l'utilisation des FBOs comme ceci :

    1- Création des FBOs, Render buffer et textures ;
    2- Attachement des render buffers et des textures au FBO ;

    3- Utilisation. Elle ne consiste qu'à faire un glBindFramebufferEXT(), et aussi un petit glViewport() aux dimensions de tes render buffers et/ou textures (entre deux petits glPushAttrib(GL_VIEWPORT_BIT) / glPopAttrib()) ;

    4- On supprime tout le tintouin avec nos glDelete*() bien aimés.

    Et sinon, pourquoi utilises-tu le format GL_RGB8 pour ta texture ? GL_RGBA ne te convient pas ?

    Si je puis me permettre un conseil, jettes un oeil au code source de Ogre, perso c'est comme ça que j'ai appris à utiliser les FBOs (enfin je pense savoir les utiliser ).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Merci encore pour ta réponse...

    Je n'ait pas besoin de buffer de profondeur et voici mon code après avoir regardé plein d'autres codes sources dont celui de Ogre : (je l'exécute qu'une fois à l'initialisation) :

    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
    //color
    glGenTextures(1, &texID);
    glBindTexture (GL_TEXTURE_2D, texID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glBindTexture (GL_TEXTURE_2D, 0);
     
    //stencil
    GLuint stencilID;
    glGenRenderbuffersEXT(1, &stencilID);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencilID);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX8_EXT, 512, 512);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
     
    //attach color and stencil buffers to the fbo
    glGenFramebuffersEXT(1, &fbo);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texID, 0);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, stencilID);
     
    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    if(status==GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT)
    	std::cout<<"pas ok"<<std::endl;
     
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    Il m'affiche toujours la même erreur et je commence à désespérer
    Une petite d'idée d'où l'erreur peut venir ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    plus personne ?

  7. #7
    Membre à l'essai
    Profil pro
    Ingénieur développement logiciel
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Par défaut
    salut !
    je me demandais si en ajoutant ces lignes cela ne résoudrait pas ton problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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