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 :

Plusieurs figures à dessiner


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut Plusieurs figures à dessiner
    Alors toujours dans ma quête de l'apprentissage de OpenGL 3.x, GLSL etc...
    J'aimerais par exemple dessiner plusieurs rectangles à la suite du genre |Rectangle1|Rectangle2|Rectangle3| ( 3rectangle côte à côte en gros). Donc j'ai bien compris comment fonctionnait les VBO, shaders etc... donc j'ai un rectangle assez facilement avec ce 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
     
     
    init : 
     
    #define VERTICES 0
    #define INDICES 1
    #define NUM_BUFFERS 2
     
    /* Define pour spécifier la taille d'un rectangle */
    #define LARGEUR 10.0f
    #define LONGUEUR 20.0f
    #define EPAISSEUR 1.0f
    #define ORIGINE 0.0f
     
    #define BUFFER_OFFSET(a) ((GLfloat*)NULL + (a))
     
    GLfloat vertices[48] = {
          ORIGINE, LARGEUR, ORIGINE, 0.20f, 0.60f, 0.60f,
          ORIGINE, ORIGINE, ORIGINE, 0.20f, 0.60f, 0.60f,
          ORIGINE, LARGEUR, EPAISSEUR, 0.20f, 0.60f, 0.60f,
          ORIGINE, ORIGINE, EPAISSEUR, 0.20f, 0.60f, 0.60f,
          LONGUEUR, LARGEUR, EPAISSEUR, 0.20f, 0.60f, 0.60f,
          LONGUEUR, ORIGINE, EPAISSEUR, 0.20f, 0.60f, 0.60f,
          LONGUEUR, LARGEUR, ORIGINE, 0.20f, 0.60f, 0.60f,
          LONGUEUR, ORIGINE, ORIGINE, 0.20f, 0.60f, 0.60f
       };
     
       GLuint indices[36] = {
          0, 1, 2, 2, 1, 3,
          4, 5, 6, 6, 5, 7,
          3, 1, 5, 5, 1, 7,
          0, 2, 6, 6, 2, 4,
          6, 7, 0, 0, 7, 1,
          2, 3, 4, 4, 3, 5
       };
     
       glGenBuffers(NUM_BUFFERS, buffers);
     
       glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTICES]);
       glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,
                    GL_STATIC_DRAW);
     
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]);
       glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,
                    GL_STATIC_DRAW);
     
       glBindBuffer(GL_ARRAY_BUFFER, 0);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    draw : 
     
    /* On active le buffer des sommets */
       glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTICES]);
     
       /* On active les deux tableaux génériques */
       glEnableVertexAttribArray(_positionIndex);
       glEnableVertexAttribArray(_colorIndex);
     
       /* On envoie les données sommets et couleurs */
       glVertexAttribPointer(_positionIndex, 3, GL_FLOAT, GL_FALSE,
                             6 * sizeof(GLfloat), BUFFER_OFFSET(0));
       glVertexAttribPointer(_colorIndex, 3, GL_FLOAT, GL_FALSE,
                             6 * sizeof(GLfloat), BUFFER_OFFSET(3));
     
       /* Spécification l'emplacement dans lequel il est possible d'accéder
        * aux coordonnées spatiales
        */
       glVertexPointer(3, GL_FLOAT, 3 * sizeof(GLfloat), BUFFER_OFFSET(0));
       glColorPointer(3, GL_FLOAT, 3 * sizeof(GLfloat), BUFFER_OFFSET(3));
     
       /* activation des tableaux de sommets */
       glEnableClientState(GL_VERTEX_ARRAY);
       glEnableClientState(GL_COLOR_ARRAY);
     
       /* On active le buffer des indices */
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]);
       /* Rendu de la géométrie */
       glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
     
       /* Désactivation des buffers vertices et indices */
       glBindBuffer(GL_ARRAY_BUFFER, 0);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
     
       /* Désactivation des tableaux génériques */
       glDisableVertexAttribArray(_positionIndex);
       glDisableVertexAttribArray(_colorIndex);
    Mais ce code ne dessine qu'un rectangle on est d'accord et je ne vois pas comment faire pour dessiner plusieurs rectangles différents (donc pas situé au même endroit par contre avec le même gabarit).

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    En gros, ton rectangle est stocké dans ton VBO. Tu fais ça (je te donne un algorithme encore une fois, après à toi de cherche l'implémentation):

    Algorithme:
    -----------

    dessiner_rectangle() # avec ton VBO.
    translater_repere() # tu translates avec une matrice de translation.
    dessiner_rectangle() # le même VBO.

    Bon, je t'explique peut-être le deuxième point. En gros, tu as ta matrice ModelView. Tu dessines ton rectangle en passant cette matrice au Shader.
    Ensuite, tu vas modifier ModelView en lui appliquant une translation.
    Puis tu dessines ton rectangle en passant la nouvelle ModelView.

    Tu comprends le principe ?

  3. #3
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Ah donc j'ai juste a appliquer une translation, moi qui pensait que je devais refaire chaque rectangle, d'où mon hésitation et mon interrogation sur l'efficacité des VBOs. Vue comme ça c'est directement plus efficace.
    Je vais essayer de voir ça et je reviendrais si j'ai un soucis.

  4. #4
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Bon j'ai essayé de faire un truc comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(e->key() == Qt::Key_R) {
          _view *= glm::translate(glm::vec3(LONGUEUR, 0.0f, 0.0f));
          draw();
    }
    Pour que cela me rajoute un rectangle a coté de celui dessiné précédemment lors de la pression de la touche R mais cela ne produit rien.
    _view c'est ma matrice 4x4 de view qui est lié au shader par la variable uniform viewMatrix

    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
     
    // VERTEX SHADER
    #version 130
     
    // Attributs
    in vec3 vertexPosition_in;
    in vec3 color_in;
     
    // Uniform
    uniform mat4 projectionMatrix;
    uniform mat4 viewMatrix;
    uniform mat4 translation;
     
     
    // Sorties
    out vec3 color_v;
     
    void main ()
    {
    	gl_Position = projectionMatrix * viewMatrix * translation *
                          vec4(vertexPosition_in, 1.0);
    	color_v = color_in;
    }
    Donc je comprends bien, je dessine mon rectangle, puis je fais une translation, pour cela j'ai créé une matrice 4x4 de translation sur x d'une valeur de LONGUEUR (20.0f) qui est la longueur de mon rectangle. Je pense que l'erreur vient surement de ma multiplication direct.

    EDIT : Bon je capte finalement pas :s j'ai une matrice _view qui est censé représenter la matrice modelview que j'utilise dans init a un moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _view =
           glm::lookAt(eye, vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f));
    Donc je pense que ma partie glm::translate(glm::vec3(LONGUEUR, 0.0f, 0.0f)); doit être bonne ca me retourne logiquement une matrice de translation par contre de l'appliquer a _view par un _view *= glm::translate(glm::vec3(LONGUEUR, 0.0f, 0.0f)); cela ne fonctionne pas et j'ai bien du mal a comprendre pourquoi... rrrh quel boulet...

Discussions similaires

  1. plusieurs figure dans un slide
    Par polochonad dans le forum Beamer
    Réponses: 3
    Dernier message: 25/06/2009, 15h47
  2. [Débutant] plusieurs figures dans une seulle
    Par cocanouar dans le forum MATLAB
    Réponses: 2
    Dernier message: 20/04/2009, 10h48
  3. insérer plusieurs figures
    Par Christinita dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 16/03/2009, 18h04
  4. Union de plusieurs figures
    Par smyley dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 07/06/2008, 07h57
  5. Réponses: 4
    Dernier message: 05/02/2008, 21h00

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