2011-10-07 5 views
2

J'ai essayé d'implémenter une meilleure façon de dessiner des choses, et j'ai essayé d'utiliser Vertex Buffers. Maintenant, j'ai suivi le Tutoriel du , mais ça ne marche pas pour moi, ça ne dessine pas du tout (pour autant que je puisse voir). Si je dessine avec glVertex3d() à la place, tout fonctionne bien.OpenGL Vertex Buffer ne dessine pas (LWJGL)

Voici comment il ressemble:

import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL12.*; 

import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.opengl.ARBVertexBufferObject; 
import org.lwjgl.opengl.GLContext; 

public abstract class Shape { 

public void render() 
{ 
    if(vertexBufferID > 0 && indexBufferID > 0) 
    { 
     glEnableClientState(GL_VERTEX_ARRAY); 
     ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vertexBufferID); 
     glVertexPointer(3, GL_FLOAT, 0, 0); 

     if(colorBufferID > 0) 
     { 
      glEnableClientState(GL_COLOR_ARRAY); 
      ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, colorBufferID); 
      glColorPointer(4, GL_FLOAT, 0, 0); 
     } 

     if(textureCoordBufferID > 0) 
     { 
      glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
      ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, textureCoordBufferID); 
      glColorPointer(2, GL_FLOAT, 0, 0); 
     } 

     if(normalBufferID > 0) 
     { 
      glEnableClientState(GL_NORMAL_ARRAY); 
      ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, normalBufferID); 
      glNormalPointer(GL_FLOAT, 0, 0); 
     } 

     ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ELEMENT_ARRAY_BUFFER_ARB, indexBufferID); 
     glDrawRangeElements(drawMode, 0, verticesNumber, verticesNumber, 
          GL_UNSIGNED_INT, 0); 

     glDisableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 
     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
     glDisableClientState(GL_NORMAL_ARRAY); 
    } 
} 

public static int createVBOID() 
{ 
     if (GLContext.getCapabilities().GL_ARB_vertex_buffer_object) { 
     IntBuffer buffer = BufferUtils.createIntBuffer(1); 
     ARBVertexBufferObject.glGenBuffersARB(buffer); 
     return buffer.get(0); 
     } 
     return 0; 
} 

public static void bufferData(int id, FloatBuffer buffer) 
{ 
     if (GLContext.getCapabilities().GL_ARB_vertex_buffer_object) 
     { 
      ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, id); 
      ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, buffer, ARBVertexBufferObject.GL_STATIC_DRAW_ARB); 
     } 
} 

public static void bufferElementData(int id, IntBuffer buffer) 
{ 
    if (GLContext.getCapabilities().GL_ARB_vertex_buffer_object) 
    { 
     ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ELEMENT_ARRAY_BUFFER_ARB, id); 
     ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ELEMENT_ARRAY_BUFFER_ARB, buffer, ARBVertexBufferObject.GL_STATIC_DRAW_ARB); 
    } 
} 

@Override 
protected void finalize() throws Throwable 
{ 
    if(vertexBufferID > 0) ARBVertexBufferObject.glDeleteBuffersARB(vertexBufferID); 
    if(colorBufferID > 0) ARBVertexBufferObject.glDeleteBuffersARB(colorBufferID); 
    if(textureCoordBufferID > 0) ARBVertexBufferObject.glDeleteBuffersARB(textureCoordBufferID); 
    if(indexBufferID > 0) ARBVertexBufferObject.glDeleteBuffersARB(indexBufferID); 

    super.finalize(); 
} 

protected int verticesNumber; 
protected int drawMode; 

protected int vertexBufferID; 
protected int colorBufferID; 
protected int textureCoordBufferID; 
protected int normalBufferID; 
protected int indexBufferID; 
} 

Et la sous-classe, remplissant en fait le Contenu:

import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.opengl.GL11; 

public class ShapeCube extends Shape{ 

public ShapeCube() 
{  
    drawMode = GL11.GL_QUADS; 

    verticesNumber = 6 * 4; 

    FloatBuffer vertices = BufferUtils.createFloatBuffer(verticesNumber * 3); 
    IntBuffer indices = BufferUtils.createIntBuffer(verticesNumber); 

    for(float x = -0.5F; x < 1; x++) for(float y = -0.5F; y < 1; y++) for(float z = -0.5F; z < 1; z++) 
    { 
     vertices.put(new float[]{x, y, z}); 
    } 

    indices.put(new int[]{0, 1, 2, 3, 4, 5, 6, 7}); 
    indices.put(new int[]{0, 1, 4, 5, 2, 3, 6, 7}); 
    indices.put(new int[]{0, 2, 4, 6, 1, 3, 5, 7}); 

    vertexBufferID = createVBOID(); 
    bufferData(vertexBufferID, vertices); 

    indexBufferID = createVBOID(); 
    bufferElementData(indexBufferID, indices); 
} 
} 

Comme je l'ai dit, ce code ne dessine rien (je vois) pour moi. Je suis sûr que j'appelle le bon code au bon endroit, et il devrait dessiner un simple cube coloré. Je suis sûr que je dois manquer quelque chose de facile, mais je n'ai aucune expérience avec les objets Vertex Buffer.

Répondre

2

J'ai trouvé la réponse moi-même maintenant. Pour tout le monde, la position des Buffers que j'ai utilisés doit être définie sur Zero. Ensuite, cela fonctionne parfaitement :)