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 :

Charger décharger et modifier les vertex du VBO [OpenGL 3.x]


Sujet :

OpenGL

Vue hybride

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut Charger décharger et modifier les vertex du VBO
    Bonjour !

    je commence tout juste à rentrer dans opengl, et j'ai un peu de mal à comprendre comment changer le nombre de vertex d'un objet.

    Je souhaite par exemple changer la forme de mon objet d'un carré en triangle par appel clavier.

    Le programme_shader est compilé au démarrage de l'appli, et fonctionne avec la forme initialisée au début, mais dès que je lance load_vertex_array(Carre) plus rien ne s'affiche. Faut il détruire le programe shader et le recompiler ? auquel cas quelle procédure utiliser ?

    J'ai l'impression de louper quelque chose dans la comprehension de tout çà ...

    merci !

    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
     
    //formes prédéfinies
    GLfloat Carre[] = {
            -0.5f,	0.5f,	0.0f,
    		 0.5f,  0.5f,	0.0f,
    		 0.5f, -0.5f,	0.0f,
    		-0.5f, -0.5f,	0.0f
            };
     
     
    GLfloat Triangle[] = {
    		 0.0f,	0.5f,	0.0f,
    		 0.5f, -0.5f,	0.0f,
    		-0.5f, -0.5f,	0.0f,
    	};
    Le chargement de l'objet

    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
     
    int load_vertex_array(GLfloat *PPoints)
    {
        polygon_size=sizeof (PPoints);
     
       glBindBuffer (GL_ARRAY_BUFFER, vbo);
     
       glBufferData (GL_ARRAY_BUFFER, (polygon_size*3) * sizeof (GLfloat), PPoints, GL_STATIC_DRAW);
     
       glBindBuffer (GL_ARRAY_BUFFER, vbo);
     
      glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE,sizeof(PPoints),  NULL);
     
      glBindVertexArray(0);
     
    return(0);
    }
    L'affichage de l'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int draw_polygon()
    {
        glUseProgram (shader_programme);
        glBindVertexArray (vao);
     
        glDrawArrays (GL_POLYGON, 0, polygon_size);
        glUseProgram(0);
        return(0);
    }
    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
     
    // draws a single frame
    int RenderMain() {
     
        // clear everything
        glClearColor(0.3f, 0.3f, 0.3f, 1.0f);//background color
        glClear (GL_COLOR_BUFFER_BIT |  GL_DEPTH_BUFFER_BIT );
        glEnable(GL_BLEND) ;
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
        draw_polygon();
     
        if(index_show_menu_geometry==1)
        {draw_menu_geometry(window, menu_geometry_x, menu_geometry_y);}
     
        sprintf(feedback,"x:%f - y: %f Action: %d Polygon points: %d", mouse_ox ,mouse_oy , click_button_action_is,polygon_size);
        print_data_feedback(-.99,.95,.4,.1);
     
        glDisable(GL_BLEND);
     
    return(0);
    }

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 10
    Par défaut
    Je n'ai regardé qu'en diagonale, mais dans le chargement de ton objet, tu as oublié un glEnableVertexAttribArray(0).

    Peut être que le problème viens de là .

    Sinon non, le shader se compile une fois pour toutes .

  3. #3
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    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 033
    Billets dans le blog
    12
    Par défaut
    Dans ta méthode load_vertex_array, tu initialises polygon_size à sizeof( PPoints ), ce qui te donne 4 sur une application 32 bits et 8 sur une application 64 bits, ce qui (comme tu l'auras deviné) est faux, tu veux récupérer la taille de ton buffer. Je vois 3 méthodes pour cela :
    • Passer une pointeur de début et un pointeur de fin à ta méthode, faire la différence des pointeurs pour avoir la taille
    • Passer la taille de ton buffer en paramètre de ta méthode
    • Changer de structure et utiliser un std::vector pour utiliser la fonction membre size()


    De même, tu réutilises sizeof( PPoints ) dans glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE,sizeof(PPoints), NULL);, dans le paramètre qui correspond au "stride". Ici, au vu de tes buffers, tu peux passer ce paramètre à zéro, sinon il correspond à l'espacement en mémoire entre deux sommets. Ca fonctionne pour l'instant car tu compiles certainement en 32 bits, et sizeof( PPoints ) vaut donc 4 (qui est également sizeof( GLfloat ))

    Corrige déjà ça, après on verra ^^.
    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 averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut
    bonjour et merci de vos réponses !
    ok pour passer sur les structures, sauf que je commence à vraiment panouiller ... je pensais avoir compris, mais passer le tableau à la fonction ne fonctionne pas ...

    Qu'est ce que je loupe dans le passage d'arguments ?

    Dans le main, :

    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
     
     
     
    #include <vector>
    using namespace std;
     
     
     
     
    typedef struct 
    {
        float x, y, z;
    }Vertex;
     
     
    std::vector<Vertex> Carre_vertices;
    std::vector<Vertex> Triangle_vertices;
     
     
    Triangle_vertices={
    		 0.0f,	0.5f,	0.0f,
    		 0.5f, -0.5f,	0.0f,
    		-0.5f, -0.5f,	0.0f
    	};
     
    Carre_vertices ={
            -0.5f,  0.5f, 0.0f,
             0.5f,  0.5f, 0.0f,
             0.5f, -0.5f, 0.0f,
            -0.5f, -0.5f, 0.0f
    };
     
     
     
    int main()
    {
    ...
    }
    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
     
     
     
    int load_vertex_array( Vertex *vertices)
    {
     
        glEnableVertexAttribArray(0);
        polygon_size= vertices.size() * sizeof(Vertex),
     
     
       glBufferData (GL_ARRAY_BUFFER,  polygon_size,  &vertices[0],    GL_STATIC_DRAW)
     
       glBindBuffer (GL_ARRAY_BUFFER, vbo);
     
       glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, polygon_size,  NULL);
     
       return(0);
    }
     
    int draw_polygon()
    {
        glUseProgram (shader_programme);
        switch(forme)
        {
        case 0:
            	glBindVertexArray (vao); load_vertex_array(Carre_vertices ) ;	glDrawArrays (GL_POLYGON, 0, polygon_size);
        break;
        case 1:
             	glBindVertexArray (vao); load_vertex_array(Triangle_vertices ) ;	glDrawArrays (GL_POLYGON, 0, polygon_size);
        break;
        }
     
     
        glUseProgram(0);
        return(0);
    }
    en retour de compilo (mingw32 codeblocks) j'ai:
    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
     
    ||=== Build: Release in REDKAT (compiler: GNU GCC Compiler) ===|
    ..\REDKAT\librairies\include\GLUT\glut.h|58|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
    ..\REDKAT\librairies\include\GLUT\glut.h|66|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
    ..\REDKAT\librairies\include\GLUT\glut.h|67|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
    ..\REDKAT\librairies\include\GLUT\glut.h|68|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
    ..\REDKAT\librairies\include\GLUT\glut.h|76|warning: ignoring #pragma warning  [-Wunknown-pragmas]|
    ..\REDKAT\librairies\include\GLUT\glut.h|77|warning: ignoring #pragma warning  [-Wunknown-pragmas]|
    ..\REDKAT\shaders.c|97|error: 'Vertex' was not declared in this scope|
    ..\REDKAT\shaders.c|97|error: 'vertices' was not declared in this scope|
    ..\REDKAT\shaders.c|98|error: expected ',' or ';' before '{' token|
    ..\REDKAT\shaders.c||In function 'int draw_polygon()':|
    ..\REDKAT\shaders.c|119|error: 'Carre_vertices' was not declared in this scope|
    ..\REDKAT\shaders.c|119|error: 'load_vertex_array' cannot be used as a function|
    ..\REDKAT\shaders.c|122|error: 'Triangle_vertices' was not declared in this scope|
    ..\REDKAT\shaders.c|122|error: 'Tirangle_vertices' was not declared in this scope|
    ..\REDKAT\shaders.c|122|error: 'load_vertex_array' cannot be used as a function|
    ..\REDKAT\gui.cpp||In function 'int draw_menu_geometry(GLFWwindow*, double, double)':|
    ..\REDKAT\gui.cpp|217|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
    C:\redKAT\REDKAT\main_redKAT.cpp|41|error: 'Triangle_vertices' does not name a type|
    C:\redKAT\REDKAT\main_redKAT.cpp|47|error: 'Carre_vertices' does not name a type|
    C:\redKAT\REDKAT\main_redKAT.cpp||In function 'int main()':|
    C:\redKAT\REDKAT\main_redKAT.cpp|108|error: 'Carre' was not declared in this scope|
    ..\REDKAT\librairies\include\GLUT\glut.h|486|warning: 'void glutInit_ATEXIT_HACK(int*, char**)' defined but not used [-Wunused-function]|
    ..\REDKAT\librairies\include\GLUT\glut.h|503|warning: 'int glutCreateWindow_ATEXIT_HACK(const char*)' defined but not used [-Wunused-function]|
    ..\REDKAT\librairies\include\GLUT\glut.h|549|warning: 'int glutCreateMenu_ATEXIT_HACK(void (__attribute__((__cdecl__)) *)(int))' defined but not used [-Wunused-function]|
    ||=== Build failed: 11 error(s), 10 warning(s) (0 minute(s), 0 second(s)) ===|

  5. #5
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    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 033
    Billets dans le blog
    12
    Par défaut
    Pour passer un std::vector en paramètre d'une fonction, on ne passe pas un pointeur sur ses données, mais une référence (constante ou non) sur lui-même.
    Donc le prototype de ta fonction devrait être de la forme int load_vertex_array( std::vector< Vertex > const & vertices ).

    Pour les autres erreurs, tu devrais vérifier tes inclusions, ainsi que l'endroit où tu déclares ton type Vertex et tes 2 variables (globales ... c'est moche) Carre_vertices et Triangle_vertices.
    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).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut
    merci dragonjoker.

    hélas je n'arrive à rien avec les structures et GCC me renvoie que des erreurs juste sur la déclaration de la structure en vector.
    EDIT:
    toujours le problème pour passer in vector au BufferData: glBufferData (GL_ARRAY_BUFFER, polygon_size, Carre_vertices, GL_STATIC_DRAW);

    le compilo me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\redKAT\REDKAT\main_redKAT.cpp|108|error: cannot convert 'std::vector<Vertex>' to 'const GLvoid* {aka const void*}' in argument passing|


    pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct Vertex
    {
            float x, y, z;
    };
     
    std::vector<Vertex> Carre_vertices;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            polygon_size= Carre_vertices.size() * sizeof(Vertex);
    	glGenBuffers (1, &vbo);
    	glBindBuffer (GL_ARRAY_BUFFER, vbo);
    	glBufferData (GL_ARRAY_BUFFER, polygon_size, Carre_vertices, GL_STATIC_DRAW);

    oulalala... et au secours...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/05/2004, 15h00
  2. [VBA-E]modifier les attributs d'un commentaire dans une cellule
    Par Olivier vb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/03/2004, 10h26
  3. [EXCEL]Modifier les marges d'une page dans Excel
    Par ms91fr dans le forum Composants VCL
    Réponses: 4
    Dernier message: 06/01/2004, 15h26
  4. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38

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