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 :

EXC_BAD_ACCESS sur un glDrawRangeElements


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 32
    Par défaut EXC_BAD_ACCESS sur un glDrawRangeElements
    Bonjour,

    je suis en train de me battre avec OpenGL et je ne trouve pas de solution.

    je travail sur l'affichage de la scene avec l'aide des VBO. A chaque tentative, j'obtien un joli:

    Nom du signal :
    EXC_BAD_ACCESS
    Signification du signal :
    Could not access memory
    voila 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
     
    //ma structure de donnée
    GLuint m_VertexBuffer;
                SVertex* m_VertexBufferContent;
     
                bool m_IsLocked;
                bool m_IsEnable;
     
                // identifiant de l'indexbuffer
                GLuint m_IndexBuffer;
                ushort* m_IndexBufferContent;
     
                int m_Numvertex;
                int m_NumIndex;
    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
     
    //Definition de mon modele:
     this->aMesh = new projet::models::CModelsMesh();
        SVertex aVertex;
        aVertex.nx=0;
        aVertex.ny=0;
        aVertex.nz=0;
        aVertex.s0=0;
        aVertex.t0=0;
        aVertex.x=0;
        aVertex.y=0;
        aVertex.z=0;
        this->aMesh->addVertex(aVertex);
     
        aVertex.nx=0;
        aVertex.ny=0;
        aVertex.nz=0;
        aVertex.s0=0;
        aVertex.t0=0;
        aVertex.x=1;
        aVertex.y=0;
        aVertex.z=0;
        this->aMesh->addVertex(aVertex);
     
        aVertex.nx=0;
        aVertex.ny=0;
        aVertex.nz=0;
        aVertex.s0=0;
        aVertex.t0=0;
        aVertex.x=1;
        aVertex.y=1;
        aVertex.z=0;
        this->aMesh->addVertex(aVertex);
     
        aVertex.nx=0;
        aVertex.ny=0;
        aVertex.nz=0;
        aVertex.s0=0;
        aVertex.t0=0;
        aVertex.x=0;
        aVertex.y=1;
        aVertex.z=0;
        this->aMesh->addVertex(aVertex);
     
        this->aMesh->addIndex((ushort)0);
        this->aMesh->addIndex((ushort)2);
        this->aMesh->addIndex((ushort)3);
     
        this->aMesh->addIndex((ushort)0);
        this->aMesh->addIndex((ushort)1);
        this->aMesh->addIndex((ushort)2);
     
        this->aMesh->updateIndexBuffer();
        this->aMesh->updateVertexBuffer();
    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
     
    // la creation des buffers
    void CModelsMesh::updateIndexBuffer()
            {
                this->m_NumIndex = this->m_IndexBufferVector.size();
     
                this->m_IndexBufferContent = new ushort[this->m_NumIndex];
                for(int i=0;i< this->m_NumIndex;i++)
                {
                    this->m_IndexBufferContent[i]=this->m_IndexBufferVector[i];
                    std::cout << this->m_IndexBufferContent[i] << std::endl;
                }
     
     
                glGenBuffers(1, &this->m_IndexBuffer);
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_IndexBuffer);
                glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(ushort) * this->m_NumIndex,
                             this->m_IndexBufferContent, GL_STATIC_DRAW);
                //return this->m_IndexBuffer;
            }
     
    void CModelsMesh::updateVertexBuffer()
            {
                this->m_Numvertex = this->m_VertexBufferVector.size();
                this->m_VertexBufferContent = new SVertex[this->m_Numvertex];
     
                for(int i=0;i< this->m_Numvertex;i++)
                {
                    this->m_VertexBufferContent[i]=this->m_VertexBufferVector[i];
                }
                glGenBuffers(1, &this->m_VertexBuffer);
                glBindBuffer(GL_ARRAY_BUFFER, this->m_VertexBuffer);
                glBufferData(GL_ARRAY_BUFFER, sizeof(SVertex) * this->m_Numvertex,
                             &this->m_VertexBufferContent[0].x, GL_STATIC_DRAW);
                //return this->m_VertexBuffer;
            }

    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
     
    //et l'affichage
     glBindBuffer(GL_ARRAY_BUFFER, aMeshPart->getParent()->getVertexBuffer());
        glEnableClientState(GL_VERTEX_ARRAY);
     
        glVertexPointer(3, GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(0));   //The starting point of the VBO, for the vertices
        glEnableClientState(GL_NORMAL_ARRAY);
     
        glNormalPointer(GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(12));   //The starting point of normals, 12 bytes away
        glClientActiveTexture(GL_TEXTURE0);
     
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(2, GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(24));   //The starting point of texcoords, 24 bytes away
     
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, aMeshPart->getParent()->getIndexBuffer());
     
        glDrawRangeElements(GL_TRIANGLES, 0, 3, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   //The starting point of the IBO
    cela va faire pret de 3jours que je toruture mon cerveau mais je ne trouve rien ni sur internet ni dans la doc... avez vous une idée?

    merci beaucoup d'avance

    T.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 157
    Billets dans le blog
    152
    Par défaut
    Bonjour,

    L'erreur est ultra étrange. Je ne pense pas qu'elle soit produite par OpenGL.

    Pouvez vous tout de même indiquer quel est le pilote que vous utilisez et sa version ( et aussi l'OS )

    Sinon, peut on voir la fonction aMeshPart->getParent()->getVertexBuffer()
    Et puis, je ne fais pas beaucoup confiance à l'exemple de OpenGL qui utilise des offset de buffer ( mais ça devrait marcher ).

    Je peux aussi vous dire, que si le glDrawRangeElements plante, c'est à cause des données en entrées ou des paramètres ( glVertexPointer() ... glColorPointer() ... )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 32
    Par défaut
    merci pour ta reponse
    j'utilise Mac OS X avec les dernières maj.

    voila le code getVertexBuffer():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GLuint CModelsMesh::getVertexBuffer() const
    	{
    	    return this->m_VertexBuffer;
    	}
    T.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 157
    Billets dans le blog
    152
    Par défaut
    Qu'est ce que le 'm_VertexBuffer' ( le type )
    Si c'est un std::vector, il faudrai plutot implémenter votre algorithme comme suit:

    Euh, attendez ...
    Non, mais pour le premier buffer, il faut retourner l'adresse mémoire des données, vous lui donnez un GLuint. Je pense que ici est la première erreur.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 32
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Qu'est ce que le 'm_VertexBuffer' ( le type )
    Si c'est un std::vector, il faudrai plutot implémenter votre algorithme comme suit:

    Euh, attendez ...
    Non, mais pour le premier buffer, il faut retourner l'adresse mémoire des données, vous lui donnez un GLuint. Je pense que ici est la première erreur.
    je ne dois pas avoir bien compris.

    m_VertexBuffer est un GLuint*

    et dans la doc openGL, glGenBuffers prend 2 parametres:
    void glGenBuffers( GLsizei n,
    GLuint * buffers);
    comment faite vous un rendu avec les VBO et openGL?

    T.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 157
    Billets dans le blog
    152
    Par défaut
    Moi je me base là dessus:

    http://www.songho.ca/opengl/gl_vbo.html ( depuis que c'est intégré dans le core, les extensions peuvent être évitées )
    et
    http://www.opengl.org/wiki/Vertex_Buffer_Object

    Je serai tenté de demander tout le projet, car je suis un peu perdu ( et pour que je puisse le compiler moi même )

    Ou au minimum, il faudra que vous me montriez le code utilisé pour envoyé les données au GPU. ( Il semble que dans ce cas, ce soit un glBufferSubData() )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [Mappy] [API IOS] EXC_BAD_ACCESS sur removeElement
    Par olive.22 dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 20/12/2010, 21h02
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  3. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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