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 :

bug de mon chargeur de fichiers.OBJ(surement du a une mauvaise implementation des VBO


Sujet :

OpenGL

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut bug de mon chargeur de fichiers.OBJ(surement du a une mauvaise implementation des VBO
    Salut,

    j'ai un probleme avec ma fonction qui charge mon fichier wave front .obj en memoire serveur:
    voici le code en question:
    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
    bool Mesh::Load(const std::string& fileName){
        if(!m_OBJFile.Load(fileName))
            return false;
     
        glGenBuffersARB(1, &m_indexBuffer);
        GLuint buffer[3];
        glGenBuffersARB(3, buffer);
     
        //alloc memory for position, texture and normal buffers
        for(unsigned int i  = 0; i < 3; i ++){
            glBindBufferARB(buffer[i], GL_ARRAY_BUFFER);
                glBufferDataARB(GL_ARRAY_BUFFER, m_OBJFile.GetNbVertex() * sizeof(float) * 3, NULL, GL_STREAM_DRAW);
        }
     
        std::vector<unsigned int> index;
        unsigned int currentOffset = 0;
        unsigned int begin = 0;
     
        for(unsigned int i  = 0; i < m_faces.size(); i ++){
     
                //position buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[POSITION]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Positions.size()*sizeof(float), &(m_faces[i].Positions[0]) );
     
                //texture buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[TEXTURE]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Textures.size()*sizeof(float), &(m_faces[i].Textures[0]) );
     
                //normals buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[NORMAL]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Normals.size()*sizeof(float), &(m_faces[i].Normals[0]) );
     
                glBindBufferARB(GL_ARRAY_BUFFER, 0);
     
                PolytoTriangles(index, m_faces[i].Positions.size()/3, begin);
                begin += m_faces[i].Positions.size()/3;
                currentOffset += m_faces[i].Positions.size();
                cout << m_faces[i].Textures.size()*sizeof(float) << endl;
        }
     
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
            glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * index.size(), NULL, GL_STREAM_DRAW);
            glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER,0,  sizeof(unsigned int) * index.size(), &index[0]);
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
     
     
        return true;
    }
    pour l'affichage, j'appelle cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Mesh::Draw(){
     glBindBufferARB(GL_VERTEX_ARRAY, buffer[POSITION]);
            glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(NULL));
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
            glDrawElements(GL_TRIANGLES, m_nbIndex, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
     
     
    }
    et la fonction PolytoTriangles, qui transforme un polygon convexe en plusierus triangles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Mesh::PolytoTriangles(vector<unsigned int>& v, const unsigned int s, const int begin){
        for(unsigned int i  = 1; i < s - 1; i ++){
            v.push_back(begin);
            v.push_back(begin+i);
            v.push_back(begin+i+1);
            m_nbIndex ++;
        }
    }
    le programme crach à l'execution, et plus precisement à la fonction DrawElement.

    merci pour l'aide
    dommage

  2. #2
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut il manque les

    glEnableClientState glVertexPointer glNormalPointer glTexCoordPointer

    dans ta fonction Draw ???

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    euh les aEnable je l'es faits une fois au debut du programme et je ne les desactive pas
    sinon c'est vrai j'ai oublié gl*Pointer je ne sais ce qui m'a pris

    et bien meme avec ça marche pas(crash au meme endroit)
    dommage

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    personae ne peut m'aider?
    dommage

  5. #5
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    ben si envoie ton code complet alors !
    (avec les gl*pointer de préférence)

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    ok voila tout le 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
    #include "Mesh.h"
    using namespace std;
    Mesh::Mesh(): m_OBJFile(m_faces)
    {
        m_nbVertex = 0;
     
    }
     
    bool Mesh::Load(const std::string& fileName){
        if(!m_OBJFile.Load(fileName))
            return false;
     
        glGenBuffersARB(1, &m_indexBuffer);
     
        glGenBuffersARB(3, buffer);
     
        //alloc memory for position, texture and normal buffers
        for(unsigned int i  = 0; i < 3; i ++){
            glBindBufferARB(buffer[i], GL_ARRAY_BUFFER);
                glBufferDataARB(GL_ARRAY_BUFFER, m_OBJFile.GetNbVertex() * sizeof(float) * 3, NULL, GL_STREAM_DRAW);
        }
     
        std::vector<unsigned int> index;
        unsigned int currentOffset = 0;
        unsigned int begin = 0;
     
        for(unsigned int i  = 0; i < m_faces.size(); i ++){
     
                //position buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[POSITION]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Positions.size()*sizeof(float), &(m_faces[i].Positions[0]) );
     
                //texture buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[TEXTURE]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Textures.size()*sizeof(float), &(m_faces[i].Textures[0]) );
     
                //normals buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[NORMAL]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Normals.size()*sizeof(float), &(m_faces[i].Normals[0]) );
     
                glBindBufferARB(GL_ARRAY_BUFFER, 0);
     
                PolytoTriangles(index, m_faces[i].Positions.size()/3, begin);
                begin += m_faces[i].Positions.size()/3;
                currentOffset += m_faces[i].Positions.size();
                cout << m_faces[i].Textures.size()*sizeof(float) << endl;
                m_nbVertex += m_faces[i].Positions.size();
     
        }
     
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
            glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * index.size(), NULL, GL_STREAM_DRAW);
            glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER,0,  sizeof(unsigned int) * index.size(), &index[0]);
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
     
     
        return true;
    }
     
     
    void Mesh::Draw(){
        glColor3f(1, 1, 1);
        glBindBufferARB(GL_VERTEX_ARRAY, buffer[POSITION]);
            glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(NULL));
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
            glDrawElements(GL_TRIANGLES, m_nbVertex, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
     
     
    }
     
     
    void Mesh::PolytoTriangles(vector<unsigned int>& v, const unsigned int s, const int begin){
        for(unsigned int i  = 1; i < s - 1; i ++){
            v.push_back(begin);
            v.push_back(begin+i);
            v.push_back(begin+i+1);
            cout << begin << " "<< begin +i << " " <<begin + i + 1 << endl;
        }
    }
    la fonction m_OBJFile.Load(fileName) charge le fichier et rempli la structure face, je ne crois pas que vous ayez besoin de l'implentation de cette derniere, parce que je l'ai deja testé dan sun autre contexte. VOila VOila, les enable, jeles fait une fois au debut du code et je ne les desactive pas. Merci
    PS: les cout sont pour des fin de debogages

    EDIT: le projet complet + obj de test + image de texture de test: moteur_test.zip - 0.08MB les lib sont la SFML et Opengl
    dommage

  7. #7
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    voici une version qui marche à peu près ?

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    #include "Mesh.h"
    using namespace std;
    Mesh::Mesh(): m_OBJFile(m_faces)
    {
        m_nbVertex = 0;
    }
     
    bool Mesh::Load(const std::string& fileName){
        if(!m_OBJFile.Load(fileName))
            return false;
     
        glGenBuffersARB(1, &m_indexBuffer);
     
        glGenBuffersARB(3, buffer);
     
        cout << "nb vertex: " << m_OBJFile.GetNbVertex() << "\n";
        cout << "nb face: " << m_faces.size() << "\n";
        for (int i = 0; i < m_faces[0].Positions.size(); i++)
        {
            cout << "face0: " << m_faces[0].Positions[i] << "\n";
        }
     
     
        //alloc memory for position, texture and normal buffers
        for(unsigned int i  = 0; i < 3; i ++) {
            glBindBufferARB(GL_ARRAY_BUFFER, buffer[i]);
                glBufferDataARB(GL_ARRAY_BUFFER, m_OBJFile.GetNbVertex() * sizeof(float) * 3, NULL, GL_STREAM_DRAW);
        }
     
        std::vector<unsigned int> index;
        unsigned int currentOffset = 0;
        unsigned int begin = 0;
     
        for(unsigned int i  = 0; i < m_faces.size(); i ++){
     
                //position buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[POSITION]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Positions.size()*sizeof(float), &(m_faces[i].Positions[0]) );
     
                //texture buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[TEXTURE]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Textures.size()*sizeof(float), &(m_faces[i].Textures[0]) );
     
                //normals buffer sub data
                glBindBufferARB(GL_ARRAY_BUFFER, buffer[NORMAL]);
                    glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Normals.size()*sizeof(float), &(m_faces[i].Normals[0]) );
     
                glBindBufferARB(GL_ARRAY_BUFFER, 0);
     
                PolytoTriangles(index, m_faces[i].Positions.size()/3, begin);
                begin += m_faces[i].Positions.size()/3;
                currentOffset += m_faces[i].Positions.size();
                //cout << m_faces[i].Textures.size()*sizeof(float) << endl;
                if (m_faces[i].Textures.size() != m_faces[i].Positions.size()
                || m_faces[i].Normals.size() != m_faces[i].Positions.size())
                {
                    exit(0);
                }
     
                m_nbVertex += m_faces[i].Positions.size();
     
        }
    cout << "index size: " << index.size() << "\n";
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
            glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * index.size(), NULL, GL_STREAM_DRAW);
     
            glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER,0,  sizeof(unsigned int) * index.size(), &index[0]);
     
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
     
     
        return true;
    }
     
     
    void Mesh::Draw(){
     
        glEnableClientState(GL_INDEX_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);
     
        glColor3f(1, 1, 1);
        glBindBufferARB(GL_ARRAY_BUFFER, buffer[POSITION]);
            glVertexPointer(3, GL_FLOAT, 0, 0);
        glBindBufferARB(GL_ARRAY_BUFFER, buffer[TEXTURE]);
            glTexCoordPointer(3, GL_FLOAT, 0, 0);
        glBindBufferARB(GL_ARRAY_BUFFER, buffer[NORMAL]);
            glNormalPointer(GL_FLOAT, 0, 0);
     
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
     
        glDrawElements(GL_TRIANGLES, m_nbVertex, GL_UNSIGNED_INT, 0);
     
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
        if (glGetError() != GL_NO_ERROR)
        {
            // ca peut aider a trouver ses erreurs :)
            exit(1);
        }
     
    }
     
     
    void Mesh::PolytoTriangles(vector<unsigned int>& v, const unsigned int s, const int begin){
        for(unsigned int i  = 1; i < s - 1; i ++){
            v.push_back(begin);
            v.push_back(begin+i);
            v.push_back(begin+i+1);
            cout << begin << " "<< begin +i << " " <<begin + i + 1 << endl;
        }
    }

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    qu'est ce que t'as changé? et tu veux dire quoi par a peu pres?
    EDIT: et incoyablement, ton code marche parfaitement , vraiment un grand merci a toi, mais tu as changé quoi?

    EDIT : ou pas, ça ne bug pas certes, mais ça donne des resultats vraiment bizarre
    dommage

  9. #9
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    hello, je suis justement en train de me prendre la tête sur un loader 3ds, et de dire que le format obj est pas si mal (au moins il contient les normales)

    demain j'essaye de faire fonctionner ton loader car mon loader 3ds me prend vraiment la tête

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    ok merci, j'essayerai moi aussi! merci pour ton aide ):
    dommage

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    bon j'ai trouvé, il suffit de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_nbVertex = index.size();
    et ça marche
    dommage

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

Discussions similaires

  1. Bug dans mon timer
    Par FredKéKé dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/01/2006, 15h27
  2. [Upload] un bug ds un code de fichiers
    Par jack_1981 dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2005, 12h44
  3. fichier *.obj???
    Par neril dans le forum OpenGL
    Réponses: 2
    Dernier message: 13/04/2005, 10h07
  4. Réponses: 8
    Dernier message: 18/05/2004, 10h03
  5. Est-ce que les fichiers .obj sont tous les mêmes?
    Par Bubonik software dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 30/12/2003, 21h04

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