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 :

Problème avec l'utilisation des VBO


Sujet :

OpenGL

  1. #1
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut Problème avec l'utilisation des VBO
    Salut !

    J’essai de refaire ma fonction d’affichage pour qu’elle utilise les VBO.
    Le problème c’est que j’utilise glDrawElements et je n’arrive pas a l’utiliser dans les VBO

    Voici en gros mon code sans utiliser de VBO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
        glVertexPointer(3, GL_FLOAT, 0, getVertices());
        glNormalPointer(GL_FLOAT, 0, getNormals());
        glBindTexture(GL_TEXTURE_2D, mesh[meshId].subMesh[submeshId].getTextureId());
        glTexCoordPointer(2, GL_FLOAT, 0, mesh[meshId].subMesh[submeshId].getTexture());
     
        glDrawElements(GL_TRIANGLES, mesh[meshId].subMesh[submeshId].getTailleFaces(), GL_UNSIGNED_INT, getFace());
     
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    J’ai deja testé un code du style :
    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
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
        glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferVertex);
        glVertexPointer(3, GL_FLOAT, 0, 0);
     
        glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferNormal);
        glVertexPointer(3, GL_FLOAT, 0, 0);
     
        glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferTexture);
        glVertexPointer(3, GL_FLOAT, 0, 0);
     
        glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, bufferFaces);
     
        glDrawElements(GL_TRIANGLES, getTailleFaces(), GL_UNSIGNED_INT, 0);
     
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    mais ca m’affiche du n’importe quoi

    comment faire ?

    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferVertex);
    glVertexPointer(3, GL_FLOAT, 0, 0);
    	
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferNormal);
    glVertexPointer(3, GL_FLOAT, 0, 0);
        
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferTexture);
    glVertexPointer(3, GL_FLOAT, 0, 0);

  3. #3
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Merci pour ta réponse =)

    J'ai essayai d'enlever les instructions glVertexPointer mais ça m'affiche toujours tout n’importe comment

  4. #4
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ha non, en fait quand j'enlève les instruction glVertexPointer ça ne marche carrément plus :'(

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par Ekinoks
    Ha non, en fait quand j'enlève les instruction glVertexPointer ça ne marche carrément plus :'(
    Il ne faut pas ler enlever mais les modifier
    Il te faut glNormalPointer (pour les normales) et glTexCoordPointer (pour les textures).

  6. #6
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    ha oui exacts :^x à force de tout modifier pour chercher à le faire marcher j'ai oublié de remettre glNormalPointer et glTexCoordPointer :^x
    Je viens de remettre avec les bonnes instructions, mais j'ai toujours le même problème, ça afficher l'objet n'importe comment :'(

    Il faut bien Binder en élément arry buffer le tableau qui été avent dans Draw Element ?
    c'est a dir, le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glDrawElements(GL_TRIANGLES, mesh[meshId].subMesh[submeshId].getTailleFaces(), GL_UNSIGNED_INT, getFace());
    se transforme bien en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, bufferFaces);
    glDrawElements(GL_TRIANGLES, getTailleFaces(), GL_UNSIGNED_INT, 0);

  7. #7
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Je viens de faire un test intéressent, j'ai dit d'afficher l'objet en GL_POINTS pour voir ou était placer tous mes points !
    résultat, il y en a qui son bien placer sur mon objet, mais il y en a d'autre qui se place l'importe ou, et qui change d'emplacement une foi sur l'autre...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 28
    Par défaut
    Citation Envoyé par Ekinoks
    mais il y en a d'autre qui se place l'importe ou, et qui change d'emplacement une foi sur l'autre...
    glDrawElements(GL_TRIANGLES, getTailleFaces(), GL_UNSIGNED_INT, 0);

    getTailleFaces() doit renvoyer une valeur supérieur à la taille du VBO qui contient tes indices, le gpu va lire des données mémoires en dehors du VBO (d'ou des vertices placé n'importe ou) . La fonction getTailleFaces() doit renvoyer Nombre de triangles de l'objet * 3. D'autres raisons peuvent provoquer ce genre de phénomène comme par exemple utiliser des indices qui n'existe pas dans les VBOs qui contiennent les vertices, les normals et les coordonnées de texture.

  9. #9
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    non, se n'est pas un problème de taille, j'ai déjà essayer un peu toute les taille possible mais toujours pareille ... :^/

    Ca doit venir comme tu la dit de l'utilisation d’indices qui n'existe pas dans les VBOs. car en fait j'importe le model avec Cal3D, et dans l'exemple donné, il n'utilise pas de VBO, donc il y peut-être des indices dans le tableau bufferFaces qui ne sont pas pris en charge par les VBO.

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il me semble que tu ne peux avoir qu'un seul VBO actif à la fois. Donc à l'issue de tes appels, seul bufferTexture aura été envoyé à la carte.

    A mon avis avec les VBO tu es obligé d'avoir toutes les composantes de tes sommets dans le même tableau.

  11. #11
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ha ok !!! ça doit être pour ça tampi pour les VBOs alors

    Merci beaucoup a tousse pour votre aide =)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 28
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il me semble que tu ne peux avoir qu'un seul VBO actif à la fois. Donc à l'issue de tes appels, seul bufferTexture aura été envoyé à la carte.
    On peut "binder" plusieurs VBOs, 1 par type de pointeur : Vertex, Color, Texture, etc... Par contre, on peut "binder" qu'un seul index buffer.

    Il faudrait peut-être essayer avec un objet simple comme un cube, ça permettrait un debug plus facile en affichant les coordonnées et les indices dans la console.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Par défaut
    Effectivement, sinon ils seraient totalement inutiles.

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

Discussions similaires

  1. Problème avec l'utilisation des csv
    Par Awea06 dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 24/06/2009, 10h57
  2. Réponses: 2
    Dernier message: 26/11/2008, 09h28
  3. problème avec l'utilisation des CMenu
    Par estebanpianolo dans le forum MFC
    Réponses: 0
    Dernier message: 22/05/2008, 13h38
  4. Problème avec l'utilisation des variables de session
    Par WagaSeb dans le forum Langage
    Réponses: 16
    Dernier message: 22/06/2007, 15h46
  5. [WD9] Problème avec l'utilisation des threads
    Par ramaro dans le forum WinDev
    Réponses: 2
    Dernier message: 29/01/2007, 11h51

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