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 :

[OpenGL 4.x] Problème VBO


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut [OpenGL 4.x] Problème VBO
    Bonjour,

    Je vais vous exposer mon problème, mais avant tout voici un premier tuto que j'avais fait il y a quelques mois : http://www.developpez.net/forums/d12...leaux-indices/ Il expose déjà le problème très en détail.

    J'essaye de me mettre à jour en OpenGL, et j'ai un problème avec les VBO. Je suis en train de recréer un loader d'objets (format .obj). Pour un objet, je dispose de structures Vertex contenant les informations de chaque point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Vertex {
        double positions[3];
        double normals[3];
        double textcoords[2];
    };
    Ensuite, j'utilise un tableau de Vertex, nommé Vertices :

    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
    void  Geometry::createVBO()
    {
        // Create and bind a BO for vertex data
        glGenBuffers(1, &vbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vbuffer);
        glBufferData(GL_ARRAY_BUFFER, (nb_vert)*sizeof(Vertex), Vertices, GL_STATIC_DRAW);
     
        // Create and bind a BO for index data
        glGenBuffers(1, &ibuffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, nb_tri*3*sizeof(unsigned int), m_indices3, GL_STATIC_DRAW);
     
        glBindBuffer(GL_ARRAY_BUFFER,0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
     
        // Méthode 2 : Spécification des indices de tableaux
        glBindAttribLocation (m_shaderCouleur.getProgramID(), 0, "in_Vertex") ;
        glBindAttribLocation (m_shaderCouleur.getProgramID(), 1, "in_Normal") ;
        glBindAttribLocation (m_shaderCouleur.getProgramID(), 2, "in_TextCoord") ;
    }
     
    void Geometry::draw(Matrix4& projection, Matrix4& modelview) const
    {
        // Activation du shader et des tableaux Vertex Attrib
        glUseProgram(m_shaderCouleur.getProgramID());
     
        glUniformMatrix4fv(glGetUniformLocation(m_shaderCouleur.getProgramID(), "projection"), 1, GL_TRUE, projection.getValeurs());
        glUniformMatrix4fv(glGetUniformLocation(m_shaderCouleur.getProgramID(), "modelview"), 1, GL_TRUE, modelview.getValeurs());
     
        // Active les Buffers
        glBindBuffer(GL_ARRAY_BUFFER, vbuffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);
     
        // Activation des tableaux génériques
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
        glEnableVertexAttribArray(2);
     
        // Envoi des vertices et des matrices
    //    glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, 0, 0);
     
        glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, positions)));
        glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, normals)));
        glVertexAttribPointer(2, 2, GL_DOUBLE, GL_TRUE,  sizeof(Vertex), BUFFER_OFFSET(offsetof(Vertex, textcoords)));
     
    //    glDrawArrays(GL_TRIANGLES,0,8);
        glDrawElements(GL_TRIANGLES, nb_tri*3, GL_UNSIGNED_INT, 0);
     
        glDisableVertexAttribArray(2);
        glDisableVertexAttribArray(1);
        glDisableVertexAttribArray(0);
     
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
     
        glUseProgram(0);
    }
    Voici ci dessous le contenu de mon tableau Vertices et du tableau indices : on peut donc voir que tout est ok.

    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
    Vertices Sructures: 
     
    Vertex 1:  	  Positions (-1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 2:  	  Positions (1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 3:  	  Positions (1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 4:  	  Positions (1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 5:  	  Positions (-1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 6:  	  Positions (-1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 7:  	  Positions (1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 8:  	  Positions (1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 9:  	  Positions (1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 10:  	  Positions (1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 11:  	  Positions (1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 12:  	  Positions (1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 13:  	  Positions (-1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 14:  	  Positions (1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 15:  	  Positions (1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 16:  	  Positions (1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 17:  	  Positions (-1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 18:  	  Positions (-1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 19:  	  Positions (-1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 20:  	  Positions (1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 21:  	  Positions (1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 22:  	  Positions (1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 23:  	  Positions (-1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 24:  	  Positions (-1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 25:  	  Positions (-1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 26:  	  Positions (-1,-1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 27:  	  Positions (-1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 28:  	  Positions (-1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 29:  	  Positions (-1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 30:  	  Positions (-1,-1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 31:  	  Positions (-1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 32:  	  Positions (1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 33:  	  Positions (1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 34:  	  Positions (1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 35:  	  Positions (-1,1,-1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    Vertex 36:  	  Positions (-1,1,1) 	  Normals (0,0,0) 	  Textcoords (0,0)
    36 Indices triangles: (0,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,)
    glGetError() renvoie 1281 après l'envoi des matrices avec glUniformMatrix4fv(...), ensuite, il repasse à 0.

    Certains reconnaitront peut-être le problème, j'ai du arrêté d'y travailler durant plusieurs mois, école d'ing oblige. J'ai beau vérifier les paramètres, tout semble correct, je ne vois pas où est mon erreur.

    EDIT : Merci d'avance aux courageux qui se pencheront sur le problème.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    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 173
    Billets dans le blog
    155
    Par défaut
    Bonjour,

    Pour glGetError(), il faudrait le faire après chaque fonction ce qui permettra de savoir précisément quelle fonction retourne l'erreur (oui, chaque fonction peut le remettre à 0 (GL_NO_ERROR) pour dire que tout va bien).
    De plus, il faudra chercher dans gl.h 1281 (nécessite une conversion en hexa) afin de savoir quel est l'erreur/enum relevé.
    Cela donne GL_INVALID_VALUE, soit, un des paramètres des fonctions OpenGL est faux (valeur invalide pour la fonction).
    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
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 036
    Billets dans le blog
    12
    Par défaut
    Un des soucis que tu peux rencontrer vient du fait que tu appelles glUniformMatrix4fv avec en paramètre glGetUniformLocation.

    Pour plus de sureté, je te conseille de d'abord stocker la valeur retournée par glGetUniformLocation dans une variable membre de ta classe (ça évitera d'appeler cette fonction à chaque frame).

    Ensuite il faut tester si cette valeur est valide (différente de GL_INVALID_INDEX) avant de la passer à glUniformMatrix4fv.

    Cette façon de faire te permettra aussi de savoir si l'erreur 0x501 que tu as vient de glUniformMatrix4fv ou de glGetUniformLocation (ce que ton code ne permet pas de savoir).

    Enfin, tu peux nous montrer le code de ton shader ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Pour glGetError(), il faudrait le faire après chaque fonction ce qui permettra de savoir précisément quelle fonction retourne l'erreur (oui, chaque fonction peut le remettre à 0 (GL_NO_ERROR) pour dire que tout va bien).
    De plus, il faudra chercher dans gl.h 1281 (nécessite une conversion en hexa) afin de savoir quel est l'erreur/enum relevé.
    Cela donne GL_INVALID_VALUE, soit, un des paramètres des fonctions OpenGL est faux (valeur invalide pour la fonction).
    Bonjour,

    J'ai un peu décrortiqué tout cela. J'ai remarqué que glGetUniformLocation(...) retournait -1 et générait ainsi l'erreur GL_INVALID_VALUE. J'ai donc revu mon arganisation shader un peu foiteuse. J'ai créé un Objet Shader général donc chaque objet possède une pointeur afin de pouvoir l'utiliser, récupérer son id, etc...

    Maintenant, la question, c'est de savoir pourquoi glGetUniformLocation renvoit une valeur erronnée (-1 = GL_INVALID_INDEX je présume ?). Pour le coup, ma connaissance d'OpenGL et des Shaders ne me permet pas de savoir pourqui. Je n'arrive pas à trouver de tutoriel complet là dessus par ailleurs, comment avez vous fais pour apprendre ?

    Voici le code de mon shader : "couleurs.vert"

    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
    #version 140
     
    in vec3 in_Vertex;
    in vec3 in_Normal;
    #in vec3 in_Color;
    in vec2 in_TextCoord;
     
    out vec3 color;
     
    uniform mat4 projection;
    uniform mat4 modelview;
     
    void main()
    {
        gl_Position = projection * modelview * vec4(in_Vertex, 1.0);
        color = vec3(0.0,0.0,1.0);
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Solution au problème : En GLSL, on ne commente pas avec # mais avec //
    (VDM)

    Merci à tous.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    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 173
    Billets dans le blog
    155
    Par défaut
    Hum, je suis curieux. Le compilateur de shaders ne disait/repérait rien par rapport à cela ? (même pas un petit warning). Sinon, peut être que le code de chargement des shaders n'est pas correct ?
    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.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    En fait, il y avait une erreur au chargement de Shader en l'occurence, le compilateur ne me disait rien. (Un schader était créé pour chaque géometry, c'était une solution provisoire, avant de généraliser le shader). Quand j'ai corrigé ça, une erreur est alors apparue indiquant que la directive #in n'existait pas...

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

Discussions similaires

  1. Problème VBO openGl
    Par Lintel-oo dans le forum OpenGL
    Réponses: 6
    Dernier message: 26/01/2012, 00h25
  2. Problème VBO (indices et vertices)
    Par Bakura dans le forum OpenGL
    Réponses: 13
    Dernier message: 09/11/2006, 19h25
  3. Problème VBO + texture
    Par f56bre dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/08/2006, 10h20
  4. Réponses: 2
    Dernier message: 11/05/2005, 14h23
  5. Réponses: 5
    Dernier message: 18/03/2005, 21h10

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