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 :

[ JOGL ] VBO


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut [ JOGL ] VBO
    Bonjour,

    Je cherche a afficher un cube grace aux VBO.
    Les données du cube ainsi que le code sont issus du lien :http://raptor.developpez.com/tutorial/opengl/vbo/#LII-C.

    je stock le cube dans un fichier .obj
    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
    v -1.0 1.0 -1.0
    v -1.0 -1.0 -1.0
    v -1.0 1.0 1.0
    v -1.0 -1.0 1.0
    v 1.0 1.0 1.0
    v 1.0 -1.0 1.0
    v 1.0 1.0 -1.0
    v 1.0 -1.0 -1.0
     
    f 0 1 2
    f 0 1 2
    f 2 1 3
    f 4 5 6
    f 6 5 7 
    f 3 1 5 
    f 5 1 7 
    f 0 2 6 
    f 6 2 4 
    f 6 7 0 
    f 0 7 1 
    f 2 3 4 
    f 4 3 5
    Mon VBO contient les vertex dans e meme ordre que le fichier .obj.
    Les index sont également stockés dans le mm ordre sue le fichier .obj.

    Voici comment j'initialise mon 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
    15
    16
    17
    18
    19
    20
    21
    22
    logger.info("MESH init " + objet.getStructure().getModelFile());
            VertexBufferObjectStructure vbo = objet.getStructure().getVertexBufferObject();
     
            // Generate a new buffer object
            // Bind the buffer object
            this.nbVertices = vbo.getNbVertices();
            this.verticesId = generateID();
            logger.info("MESH V id " + verticesId);
            openGLContext.getGl().glBindBuffer(GL2.GL_ARRAY_BUFFER, verticesId);
            openGLContext.getGl().glBufferData(GL2.GL_ARRAY_BUFFER,
                    GLBuffers.sizeOfBufferElem(vbo.getVertexData()) * GLBuffers.SIZEOF_FLOAT,
                    // vbo.getVertexData().capacity() * GLBuffers.SIZEOF_FLOAT,
                    vbo.getVertexData(), GL2.GL_STATIC_DRAW);
     
            // Index vertices
            this.nbIndex = vbo.getIndexNb();
            this.indexId = generateID();
            logger.info("MESH index id " + indexId);
            openGLContext.getGl().glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexId);
            openGLContext.getGl().glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER,
                    GLBuffers.sizeOfBufferElem(vbo.getIndexV()) * GLBuffers.SIZEOF_INT, vbo.getIndexV(),
                    GL2.GL_STATIC_DRAW);
    et voici la fonction pour le display
    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
    public void render() {
            OpenGLContext openGLContext = GLContextManager.getInstance().getOpenGLContext();
            // vertices
            openGLContext.getGl().glBindBuffer(GL2.GL_ARRAY_BUFFER, verticesId);
            openGLContext.getGl().glVertexPointer(3, GL2.GL_FLOAT, 3 * GLBuffers.SIZEOF_FLOAT, 0);
     
            // index
            openGLContext.getGl().glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexId);
     
            // Enable Pointers
            openGLContext.getGl().glEnableClientState(GL2.GL_VERTEX_ARRAY); // Enable Vertex
     
            openGLContext.getGl().glDrawElements(GL2.GL_TRIANGLES, nbIndex, GL2.GL_UNSIGNED_INT, 0);
            // gl.glDrawElements(GL.GL_TRIANGLES, nbIndex, GL.GL_UNSIGNED_INT, 0);
     
            // Disable Pointers
            openGLContext.getGl().glDisableClientState(GL2.GL_VERTEX_ARRAY); // Disable Vertex
     
        }
    Mon rendu n'est pas bon, je n'avance pas beaucoup...
    Malgré tout pouvez vous me dire si mon code est a priori correct ???

    Merci d'avance

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


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

    Citation Envoyé par gladek Voir le message
    Mon rendu n'est pas bon, je n'avance pas beaucoup...
    Malgré tout pouvez vous me dire si mon code est a priori correct ???

    Merci d'avance
    Votre rendu n'est pas bon ?
    Qu'entendez vous par là ? Il affiche les polygones dans le mauvais ordre, il en affiche la moitié, il en affiche pas ?

    Veuillez donner le plus de description à votre problème et si possible, une capture d'écran par exemple.
    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
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    une image sera plus parlante, tu as raison


    Uploaded with ImageShack.us

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    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 035
    Billets dans le blog
    12
    Par défaut
    Euh ... au vu de cette image je vois plusieurs possibilités :
    - Ton vertex buffer ne contient pas les coordonnées voulues
    - Ta caméra est très mal placée par rapport à ton cube

    Essaie d'afficher ton cube en points pour voir si tu as les bonnes coordonnées dans ton VBO.
    Pour la caméra, il suffit de la tourner et/ou de la déplacer pour savoir si ça vient de là.

    Personnellement je penche plus vers le VBO qui ne contient pas ce qu'il faut.
    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).

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    En mode point, ts les points sont affichés.

    les points sont ceux définis dans le tuto, avec le meme ordre (vertex(x,y,z) et indices des vertices). Apparement c'est un cube composé de 12 faces (12 triangles) et 8 vertices.

    Je recupere ma liste de vertices (obj : float[] vertices) dans l'ordre decrit plus haut.
    Je crée un FloatBuffer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    this.vertexNb = vertices.length;
            this.vertexData = GLBuffers.newDirectFloatBuffer(vertices);
            // FloatBuffer.allocate(vertexNb);
            // BufferUtil.newFloatBuffer(vertexNb * 3);
            // this.vertexData.put(vertices);
            // this.vertexData.flip();
    Est ce que les parametres dans les fonctions sont bons ?
    Initialisation :
    ex pour les points(sommets):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    openGLContext.getGl().glBufferData(GL2.GL_ARRAY_BUFFER,
                    GLBuffers.sizeOfBufferElem(vbo.getVertexData()) * GLBuffers.SIZEOF_FLOAT, vbo.getVertexData(), GL2.GL_STATIC_DRAW);
    vbo.getVertexData() me renvoit toutes coordonnées (float) x1,y1,z1,x2,y2,z2,...xN,yN,zN. Sa longueur vaut nb de sommet*3.

    idem pour les indices
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    openGLContext.getGl().glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER,
                    GLBuffers.sizeOfBufferElem(vbo.getIndexV()) * GLBuffers.SIZEOF_INT, vbo.getIndexV(),
                    GL2.GL_STATIC_DRAW);

    Pour le display:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            openGLContext.getGl().glBindBuffer(GL2.GL_ARRAY_BUFFER, verticesId);
            openGLContext.getGl().glVertexPointer(3, GL2.GL_FLOAT, 3 * GLBuffers.SIZEOF_FLOAT, 0);
     
            // index
            openGLContext.getGl().glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexId);
     
            // Enable Pointers
            openGLContext.getGl().glEnableClientState(GL2.GL_VERTEX_ARRAY); // Enable Vertex
     
            openGLContext.getGl().glDrawElements(GL2.GL_TRIANGLES, nbIndex, GL2.GL_UNSIGNED_INT, 0);
            // gl.glDrawElements(GL.GL_TRIANGLES, nbIndex, GL.GL_UNSIGNED_INT, 0);
     
            // Disable Pointers
            openGLContext.getGl().glDisableClientState(GL2.GL_VERTEX_ARRAY); // Disable Vertex
    Les parametres du glVertexPointer sont ils bons : 3 * GLBuffers.SIZEOF_FLOAT ???


    merci bcp de votre aide

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    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 157
    Billets dans le blog
    152
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openGLContext.getGl().glVertexPointer(3, GL2.GL_FLOAT, 3 * GLBuffers.SIZEOF_FLOAT, 0);
    Euh, on passe 0 en tant que pointeur ? VBO. C'est les VBO donc c'est normal
    Sinon, je doute aussi pour le stride ... j'aurais mis 0, mais c'est un truc que je doute a vie (surtout que je crois que DirectX est un peu different)

    Sinon, etes vous sure que les indices sont bien lus ? (et mapper)
    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.

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

Discussions similaires

  1. [JOGL 2]VBO impossible à activer
    Par Spidy dans le forum OpenGL
    Réponses: 1
    Dernier message: 17/02/2012, 11h45
  2. [ JOGL ] Display VBO
    Par gladek dans le forum OpenGL
    Réponses: 21
    Dernier message: 15/12/2010, 13h16
  3. Utilisation des VBO avec JOGL
    Par choko83 dans le forum OpenGL
    Réponses: 4
    Dernier message: 23/11/2010, 16h30
  4. [JOGL] VBO - comportement étrange
    Par Ceejay dans le forum OpenGL
    Réponses: 8
    Dernier message: 04/05/2009, 21h30
  5. Jogl et VBO simples
    Par xion.luhnis dans le forum 3D
    Réponses: 8
    Dernier message: 14/04/2009, 22h47

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