Bonsoir à tous !
Je développe en Java avec JWJGL et j'ai développé un loader de fichiers .obj pour me former un peu à java d'une part et à opengl d'autre part.
Je souhaite effectuer le rendu du fichier en utilisant les VBOs (je l'avais déjà fait en utilisant le mode immédiat mais c'était catastrophique).
Du coup j'ai lu des tutoriels à droite à gauche (NeHe, la doc de lwjgl et d'autres) mais mon implémentation fait crasher mon application.
J'ai une classe ObjectGL qui possède une collection de Materials (une classe qui contient une liste de polygones ayant des données matérielles communes (ambiant, specular tout ça)).
Voici le code que j'utilise :
- Premièrement je génère deux ID par "materials", une pour les données et une autre pour les indices :
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 public void genVBOS() throws IOException{ if(GLContext.getCapabilities().GL_ARB_vertex_buffer_object){ //Si la carte supporte l'utilisation des VBO for (int i = 0; i < mats.size(); i+=2) { //Pour chaque "materials" on génère 2 ID (un pour les données, l'autres pour les indices) IntBuffer vbo = BufferUtils.createIntBuffer(2); ARBVertexBufferObject.glGenBuffersARB(vbo); ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vbo.get(i)); ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vvtvn, ARBVertexBufferObject.GL_STATIC_DRAW_ARB); //On envoie les vertices, normals et coordonnées de textures ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ELEMENT_ARRAY_BUFFER_ARB, vbo.get(i+1)); ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ELEMENT_ARRAY_BUFFER_ARB, mats.get(i).getIndices(), ARBVertexBufferObject.GL_ELEMENT_ARRAY_BUFFER_ARB); mats.get(i).setVbo(vbo); } } }
Et une fois que toutes mes "materials" ont leur VBO je les affiche :
L'application crashe lors de l'appel à glDrawRangeElements(), pas d'exception levée ni rien du coup je suis un peu perdu !
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 public void draw(){ for (int i = 0; i < mats.size(); i++) { int stride = (3+3+2)*4; ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, mats.get(i).getVbo().get(0)); GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); //Activation, si nécessaire, des différents Arrays int offset = 0; GL11.glVertexPointer(3, GL11.GL_FLOAT, stride, offset); if(normals){ GL11.glEnableClientState(GL11.GL_NORMAL_ARRAY); offset = 2 * 4; GL11.glTexCoordPointer(2, GL11.GL_FLOAT, stride, offset); } if(text){ GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); offset = (3 + 2) * 4; GL11.glNormalPointer(GL11.GL_FLOAT, stride, offset); } ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, mats.get(i).getVbo().get(1)); GL12.glDrawRangeElements(GL11.GL_TRIANGLES, 0, mats.get(i).getIndices().capacity(), mats.get(i).getIndices().capacity(), GL11.GL_UNSIGNED_INT, 0); } }
Est-ce que vous voyez quelque chose qui cloche là dedans ? N'hésitez pas !
J'utilise peut-être tout cela maladroitement...
Si vous avez besoin d'autres explications n'hésitez pas
Je vous remercie d'avance pour votre aide !
Partager