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 :

impossible de passer un tableau de vertex à un VBO


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut impossible de passer un tableau de vertex à un VBO
    bonjour,

    je n'arrive pas à "passer" un tableau de vertex à mon VBO

    j'ai écris une classe LoadObj qui est un simple loader de format .obj qui me stocke dans un tableau les float des coordonnées des vertex sous la forme x0,y0,z0,x1,y1,z1,...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class LoadObj
    {
    private: 
    ..
    public:
    ...
    GLfloat vertex[100];	//ici stockage des vertex
    }
    lors du débogage,après avoir chargé mon .obj,les valeurs de vertex sont ok
    vertex(100]={1.000000,-1.000000,1.000000,....}

    lorsque je passe ce tableau à glBufferData,rien ne s'affiche.

    voici le résumé du 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
     
    LoadObj a("cube.obj");
    ....
    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(a.vertex),a.vertex, GL_STATIC_DRAW);
     
    glEnableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
     
    glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
    quand je passe un tableau avec les valeurs rentrées "à la main"
    ça fonctionne,ex;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    vertex[]={1.000000,-1.000000,1.000000,...}
     
    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertex),vertex, GL_STATIC_DRAW);
     
    glEnableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
     
    glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
    qu'est ce qui ne va pas ?
    Merci de votre aide

    je suis sous windows 8.1.je travaille avec Visual C++ 2015 sous win32 avec glew,opengl 4.2

  2. #2
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Par défaut
    Cette ligne pose problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ARRAY_BUFFER, sizeof(a.vertex),a.vertex, GL_STATIC_DRAW);
    En effet le second argument requiert la taille en octet du tableau à passer. Lorsque le tableau est créer en variable locale , le compilateur n'as aucun problème pour déduire la vrai taille du tableau entier avec sizeof .
    Mais lorsque la variable viens d'une classe c'est une tout autre histoire, je ne sais pas ce que vaudra sizeof sur un attribut d'une classe. Donc ce qu'il faut faire c'est d'abord savoir la taille du tableau noté sizeTab .
    Je suppose que le tableau est de type float, d'où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*sizeTab,a.vertex, GL_STATIC_DRAW);
    NB: De ce que je vois seul un triangle devrait être affiché

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut
    merci monwarez pour ta réponse rapide,
    je réessaye tout ça et je te tiens au courant

  4. #4
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut
    essai 1;

    je définis dans ma classe LoadObj la méthode suivante;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int LoadObj::getSizeBuff()
    {
    	return sizeof(float)*nbrSommet;
     
    }
    (dans ma classe LoadObj,les vertex sont stockés dans le tableau vertex[nbrSommet]
    puis je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER,a.getSizeBuff(), a.vertex, GL_STATIC_DRAW);
     
    glEnableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
     
    glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
    mais ça ne marche toujours pas

    ------------------------------------------------------
    essai 2;

    je déclare un tableau en local;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static const GLfloat g_vertex_buffer_data[9] = {
    			a.vertex[0],a.vertex[1], a.vertex[2],
    			a.vertex[3], a.vertex[4], a.vertex[5],
    			a.vertex[6], a.vertex[7], a.vertex[8] };
    et je controle le flag d'erreur d'openGL avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    errGL()
    {
    	GLenum err;
    	if ((err= glGetError()!= GL_NO_ERROR)) MessageBox(NULL, (LPCTSTR)_T("erreur GL"), TEXT("Error"), MB_OK);
     
    }
    puis;

    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
     
    errGL();
    glGenBuffers(1, &vertexbuffer);
    errGL();
    glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer);
    errGL();
    glBufferData(GL_ARRAY_BUFFER,9*sizeof(float), g_vertex_buffer_data, GL_STATIC_DRAW);
    errGL();
     
    glEnableClientState(GL_VERTEX_ARRAY);
    errGL();
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    errGL();
    glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), 0);
    errGL();
    glDrawArrays(GL_TRIANGLES, 0, 3);
    errGL();
    glDisableClientState(GL_VERTEX_ARRAY);
    errGL();
    mais ça ne marche toujours pas.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut
    ok j'ai trouvé mon erreur
    c'est très bête de ma part (comme d'habitude..)
    les 3 première coordonnées du tableau vertex[] ne forme pas un triangle ,alors forcément comme je demande à OpenGl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glDrawArrays(GL_TRIANGLES, 0, 3);
    il ne m'affiche rien...
    la honte sur moi ...
    merci pour ton aide monwarez,
    bonne prog.

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

Discussions similaires

  1. passer un tableau a une procedure stockee
    Par graphicsxp dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/04/2005, 11h39
  2. Réponses: 11
    Dernier message: 28/02/2005, 13h23
  3. Passer un tableau à une procédure stockée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/09/2004, 18h21
  4. Tableau de vertex dans OpenGL
    Par Guizmo57 dans le forum OpenGL
    Réponses: 5
    Dernier message: 11/04/2004, 09h15
  5. passer un tableau dynamique en parametre...
    Par annecyrond dans le forum Langage
    Réponses: 5
    Dernier message: 07/03/2003, 09h59

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