Salut,

J'essaie de mettre en place les VBO sur mon projet.
L'affichage présente qq bizarreries... il ne manque pas grand chose

Je charge des .obj, ils sont tres bien affichés via la méthode classique de rendering (glBegin(), glEnd()). Je peux changer seul le parametre : GL.POINT, GL.QUAD, GL.TRIANGLES, etc.. et l'affichage reste parfait.

Or avec les VBO, si je dessine en GL.POINT, l'affichage est correct mais en GL.TRIANGLES voir STRIP seul la moitié des faces est dessiné.
Exemple un carré n'aura qu'un des 2 triangles le constituant...

Via des Junit je suis sur de stocker dans le bon ordre mes vertexData, le bon nombre de vertex etc..

AVez vous des pistes pour m'orienter ?

je glisse mon code source :
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
49
50
51
52
53
54
55
56
57
58
59
60
61
public class VBORenderer implements Renderer<SolidObjet> {
 
    private GL gl = AbstractScene.GL;
 
    private int verticesId;
    // private int indexId;
    private int nbVertices;
 
    // private int nbIndex;
 
    public void init(SolidObjet objet) {
        VertexBufferObjectStructure vbo = objet.getStructure().getVertexBufferObject();
        this.nbVertices = vbo.getNbVertices();
        // this.nbIndex = vbo.getIndexNb();
 
        // Generate a new buffer object
        // Bind the buffer object
        this.verticesId = generateID();
        gl.glBindBufferARB(GL.GL_ARRAY_BUFFER_ARB, verticesId);
        gl.glBufferDataARB(GL.GL_ARRAY_BUFFER_ARB, vbo.getVertexData().capacity() * BufferUtil.SIZEOF_FLOAT,
                vbo.getVertexData(), GL.GL_STATIC_DRAW_ARB);
 
        // // Index vertices
        // this.indexId = generateID();
        // gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER, indexId);
        // gl.glBufferDataARB(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.getIndexData().capacity() *
        // BufferUtil.SIZEOF_INT,
        // vbo.getIndexData(), GL.GL_STATIC_DRAW_ARB);
    }
 
    public void render(SolidObjet objet) {
 
        gl.glBindBufferARB(GL.GL_ARRAY_BUFFER_ARB, verticesId);
        // gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER, indexId);
 
        // Enable Pointers
        gl.glEnableClientState(GL.GL_VERTEX_ARRAY); // Enable Vertex Arrays
 
        // Set The Vertex Pointer To The Vertex Buffer
        gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
 
        // Render
        // Draw All Of The Triangles At Once
        gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, nbVertices);
        // gl.glDrawArrays(GL.GL_POINTS, 0, nbVertices);
        // gl.glDrawElements(GL.GL_TRIANGLES, nbIndex, GL.GL_UNSIGNED_INT, 0);
        // gl.glDrawElements(GL.GL_POINT, nbIndex, GL.GL_UNSIGNED_INT, 0);
 
        // Disable Pointers
        // Disable Vertex Arrays
        gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
    }
 
    private int generateID() {
        int[] tabId = new int[1];
        gl.glGenBuffersARB(1, tabId, 0);
 
        return tabId[0];
    }
 
}