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 :

Debogage Vertex Buffer Object


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut Debogage Vertex Buffer Object
    Bonjour,

    J'essaye de faire marcher les vertex buffer object mais le résultat ressemble plus a de l'art moderne qu'au lapin que je suis sensé afficher.
    Je pense qu'il y a une petite erreur quelque part mais pour la détecter je sais pas comment faire.

    Comment faire pour corriger les fautes dans ces cas la ?
    J'ai rien pour regarder les accès en mémoire de ma carte graphique, aucune erreur n'est renvoyée ni par le compilo ni par les fonctions d'openGL.
    Y a t-il une technique, un outils pour deboguer l'utilisation des fonctions d'API graphique ?


    A tout hasard, si quelqu'un arrive a trouver la faute, voici les extrait de mon code :
    Mon code est du C++ il y a le gestionnaire VBO et la classe Maillage

    Pour le gestionnaire :
    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
    int VBO::nbMaillage = 0 ;//BufferSize
    bool VBO::loadClosed = false ; //si le buffer est créé
    vector<Maillage*> VBO::maillage;//liste des maillages
    GLuint* VBO::BufferName= NULL; //GLuint BufferName[BufferSize];
     
    void VBO::run(){
            int cpt ;
     
            if ((nbMaillage > 0 )&&(maillage.empty() == false)){
                    BufferName = new GLuint[nbMaillage*2] ;//allocation de BufferName
                    glGenBuffers((GLsizei)(nbMaillage*2),BufferName);
                    loadClosed = true ;
     
                    //chargement des maillages
                    for( cpt = 0 ; cpt < maillage.size() ; cpt++){
                            maillage[cpt]->loadInBuffer() ;
                    }
            }
    }
     
    void VBO::destroy() {
            //destruction des buffers
            glDeleteBuffers(nbMaillage*2,BufferName);GL_TEST_ERR
            loadClosed = false ;
            delete[] BufferName ;
    }
     
    GLuint VBO::getBufferName(int Bufferindex){
            return BufferName[Bufferindex] ;
    }
    Et voici pour le maillage :
    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
     
    //Attribus dans le header
    int nbSommet,nbIndex ;
    float *sommetData;
    int *indexData ;//nombre de face
    GLenum loadingMode ; // STATIC STREAM ou DYNAMIC
    int sommetSize,indexSize ; //taille en octet
    int numBuffer ; // numero dans le buffer
     
    //.cpp
     
    #define BUFFER_OFFSET(i) ((char*)NULL + (i))
     
    Maillage::~Maillage(){
            delete[] sommetData ;
            delete[] indexData ;
    }
     
    void Maillage::draw(){
            if(VBO::isRunning() == true){
     
                    glBindBuffer(GL_ARRAY_BUFFER, VBO::getBufferName(numBuffer));GL_TEST_ERR
                    glBufferData(GL_ARRAY_BUFFER, sommetSize, sommetData, GL_STREAM_DRAW);GL_TEST_ERR
                    glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);GL_TEST_ERR
     
                    glBindBuffer(GL_ARRAY_BUFFER, VBO::getBufferName(numBuffer+1));GL_TEST_ERR
                    glBufferData(GL_ARRAY_BUFFER, sommetSize, sommetData, GL_STREAM_DRAW);GL_TEST_ERR
                    glVertexPointer(3, GL_FLOAT, 0, 0);GL_TEST_ERR
     
                    glEnableClientState(GL_VERTEX_ARRAY);GL_TEST_ERR
                    glEnableClientState(GL_COLOR_ARRAY);GL_TEST_ERR
     
                    //glDrawArrays(GL_TRIANGLES, 0, nbIndex*3);GL_TEST_ERR
    //test avec deux fonction differentes
    glDrawElements(GL_TRIANGLES,nbIndex*3,GL_UNSIGNED_INT,indexData) ;
                    glDisableClientState(GL_COLOR_ARRAY);
                    glDisableClientState(GL_VERTEX_ARRAY);
     
            }
    }

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Alors, plusieurs petites choses :
    • Pense à faire des GetLastError() de temps en temps ( au moins en Debug)
    • Utilise de logiciel de debug comme glIntercept par exemple pour t'aider
    • Pourquoi il y a des GL_TEST_ERR un peu partout ?
    • Es tu sur de tes types de données dans tes gl*Pointer ?
    • idem pour les indices .. check du type..
    • tu utilise les mêmes données pour ta couleur et tes vertex.. c'est normal ? Si tu entrelace tes données... tes gl*Pointer sont faux..
    • Tu envois les données au GPU à chaque draw, c'est normal ? Il est plus performant de mapper (glMap & glUnmap) pour modifier les données..


    Voilà.. c'est tout

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    Reponse a presque toute la liste :
    • Pense à faire des GetLastError() de temps en temps ( au moins en Debug)
      J'ai regarder les erreurs que peut renvoyer OpenGL mais pas Windows, je vais regarder ca
    • Pourquoi il y a des GL_TEST_ERR un peu partout ?
      J'ai trouvé une macro qui affiche s'il y a une erreur pour le debug
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      GLenum eCode;\
                  if((eCode=glGetError())!=GL_NO_ERROR)\
                      cout << "OpenGL error : " <<  gluErrorString(eCode) << " in " <<  __FILE__ << " : " << __LINE__ << std::endl;\
      Apres relecture je me rend compte que cette macro utilise glut, sachant que j'utilise SDL a la place de glut je vais pas aller loin avec cette macro.
    • Es tu sur de tes types de données dans tes gl*Pointer ?
      oui, j'ai testé avec les vertex array, ca marche très bien
    • tu utilise les mêmes données pour ta couleur et tes vertex.. c'est normal ?
      Oui c'était pour avoir de la couleur et mieux me rendre compte des faces que j'affichais, j'avais que ce tableau la sous la main.
    • Tu envois les données au GPU à chaque draw, c'est normal ?
      Cette version est très simplifié par rapport a celle de départ (l'integration big bang c'est mal, très mal) donc j'ai préféré faire une version très simple pour mieux déboguer et trouver l'erreur.


    Merci pour le glIntercept je connaissais pas, je vais l'essayer.

  4. #4
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Citation Envoyé par Robert Dumarais Voir le message
    J'ai regarder les erreurs que peut renvoyer OpenGL mais pas Windows, je vais regarder ca
    .. trop rapide ... je parlais en fait de glGetError() ...

    Citation Envoyé par Robert Dumarais Voir le message
    J'ai trouvé une macro qui affiche s'il y a une erreur pour le debug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GLenum eCode;\
                if((eCode=glGetError())!=GL_NO_ERROR)\
                    cout << "OpenGL error : " <<  gluErrorString(eCode) << " in " <<  __FILE__ << " : " << __LINE__ << std::endl;\
    Apres relecture je me rend compte que cette macro utilise glut, sachant que j'utilise SDL a la place de glut je vais pas aller loin avec cette macro.
    Attention, il ne faut pas confondre GLU et GLUT, ce ne sont pas la meme chose..

    Citation Envoyé par Robert Dumarais Voir le message
    [*] Es tu sur de tes types de données dans tes gl*Pointer ?
    oui, j'ai testé avec les vertex array, ca marche très bien
    Arff... problème de Binding ? Tes indentifiant de buffer sont bon ?

    Citation Envoyé par Robert Dumarais Voir le message
    [*] tu utilise les mêmes données pour ta couleur et tes vertex.. c'est normal ?
    Oui c'était pour avoir de la couleur et mieux me rendre compte des faces que j'affichais, j'avais que ce tableau la sous la main.
    Ok .. pas contre, tu utilise deux type différent pour le meme tableau (GL_FLOAT et GL_UNSIGNED_BYTE) .. c'est pas trop normal..

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    glGetError me renvois GL_NO_ERROR

    Avec glIntercept j'ai rien de suspect ou d'anormal.

    J'ai l'impression que la "forme" que j'affiche a ses sommets a l'infini, ou du moins très très loin.
    Donc je pense que j'affiche pas du tout les données que je lui donne.

    Je vois vraiment pas l'erreur.

  6. #6
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Peut être que ça t'aideras : http://raptor.developpez.com/tutorial/opengl/vbo

Discussions similaires

  1. Problème avec les Vertex Buffer Objects
    Par mysth dans le forum OpenGL
    Réponses: 0
    Dernier message: 18/05/2009, 21h31
  2. Problème dans un vertex Buffer Object
    Par baperpere dans le forum OpenGL
    Réponses: 0
    Dernier message: 01/03/2009, 00h26
  3. Vertex Buffer Object et performance
    Par ciberrique dans le forum OpenGL
    Réponses: 30
    Dernier message: 07/07/2008, 15h38
  4. Vertex Buffer Object avec de grands maillages
    Par Vinc35 dans le forum OpenGL
    Réponses: 8
    Dernier message: 25/10/2007, 19h46
  5. [Problème] Vertex Buffer Object
    Par Soznor dans le forum OpenGL
    Réponses: 20
    Dernier message: 19/07/2007, 18h44

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