Help! Stuck on VBOs

Started by JaredBGreat, September 17, 2013, 03:10:29

Previous topic - Next topic

JaredBGreat

OK, I've been teaching myself LWJGL and OpenGL, and was doing fine following tutorials using immediate mode, and having a little fun making spinning colored cubes and flying squares on flat green world I could flay around over (and below).  Then I learned about VBOs and the obselescents of what I had learned so far.  So I started trying to learn VBOs and though I can't figure out what I did wrong it doesn't work -- it just crashes when I try to render my VBO test model (unless I put inside the glBegin();/glEnd();, which I at first did by accident and led to no effect at all).  Anyway, does anyone know what I did wrong?  Or where I could learn this better?  Or a place to learn some other alternative?

My VBO code is like this:

   public static void makeVBO() {
        glLoadIdentity();
        numVerts = 3;
        vertSize = 3;
        colorSize = 3;
        numSegs = 3;
        numSides = 22;
        
        vboids = BufferUtils.createIntBuffer(2);
        glGenBuffers(vboids);
        
        vertData = BufferUtils.createFloatBuffer(numVerts * vertSize * numSides);
        vertData.put(new float[]  {//Base
                                   -3f, 0f, -3f, 
                                   -3f, 2f, -3f,
                                    3f, 0f, -3f,
                                    
                                   -3f, 2f, -3f,
                                    3f, 2f, -3f,
                                    3f, 0f, -3f,
        
                                   -3f, 0f,  3f, 
                                   -3f, 2f,  3f,
                                    3f, 0f,  3f,
                                    
                                   -3f, 2f,  3f,
                                    3f, 2f,  3f,
                                    3f, 0f,  3f,
        
                                   -3f, 0f, -3f,
                                   -3f, 2f, -3f,
                                   -3f, 0f,  3f,
        
                                   -3f, 2f, -3f,
                                   -3f, 2f,  3f,
                                   -3f, 0f,  3f,
        
                                    3f, 0f, -3f,
                                    3f, 2f, -3f,
                                    3f, 0f,  3f,
        
                                    3f, 2f, -3f,
                                    3f, 2f,  3f,
                                    3f, 0f,  3f,
                                   
                                    3f, 2f,  3f,
                                   -3f, 2f,  3f,
                                   -3f, 2f, -3f,
        
                                   -3f, 2f, -3f,
                                    3f, 2f, -3f,
                                    3f, 2f,  3f,
                                   
                                    3f, 0f,  3f,
                                   -3f, 0f,  3f,
                                   -3f, 0f, -3f,
        
                                   -3f, 0f, -3f,
                                    3f, 0f, -3f,
                                    3f, 0f,  3f,
        
                                   //Tower
                                   -2f, 2f, -2f, 
                                   -2f, 9f, -2f,
                                    2f, 2f, -2f,
                                    
                                   -2f, 9f, -2f,
                                    2f, 9f, -2f,
                                    2f, 2f, -2f,
        
                                   -2f, 2f,  2f, 
                                   -2f, 9f,  2f,
                                    2f, 2f,  2f,
                                    
                                   -2f, 9f,  2f,
                                    2f, 9f,  2f,
                                    2f, 2f,  2f,
        
                                   -2f, 2f, -2f,
                                   -2f, 9f, -2f,
                                   -2f, 2f,  2f,
        
                                   -2f, 9f, -2f,
                                   -2f, 9f,  2f,
                                   -2f, 2f,  2f,
        
                                   //Top
                                   -2f,  9f, -2f,
                                    0f, 12f,  0f,
                                    2f,  9f, -2f,
                                    
                                   -2f,  9f,  2f,
                                    0f, 12f,  0f,
                                   -2f,  9f, -2f,
                                    
                                   -2f,  9f,  2f,
                                    0f, 12f,  0f,
                                    2f,  9f,  2f,
                                    
                                    2f,  9f,  2f,
                                    0f, 12f,  0f,
                                    2f,  9f, -2f});        
        vertData.flip();        
        
        colorData = BufferUtils.createFloatBuffer(numVerts * colorSize * numSides);
        colorData.put(new float[]  {//Base
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
                                    
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f, 
                                    0.5f, 0.5f, 0.6f,
        
                                   //Tower                                    
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f,
                                                                       
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f,
                                                                       
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f,
                                                                       
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f,
                                                                       
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f,
                                                                       
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f, 
                                    0.55f, 0.55f, 0.6f,
        
                                   //Top
                                    0.6f, 0.6f, 0.8f, 
                                    0.6f, 0.6f, 0.8f,
                                    0.6f, 0.6f, 0.8f,
                                    
                                    0.6f, 0.6f, 0.8f, 
                                    0.6f, 0.6f, 0.8f,
                                    0.6f, 0.6f, 0.8f,
                                    
                                    0.6f, 0.6f, 0.8f, 
                                    0.6f, 0.6f, 0.8f,
                                    0.6f, 0.6f, 0.8f,
                                    
                                    0.6f, 0.6f, 0.8f, 
                                    0.6f, 0.6f, 0.8f,
                                    0.6f, 0.6f, 0.8f});
        colorData.flip();
        
        /*normData = BufferUtils.createFloatBuffer(numVerts * vertSize * numSides);
        normData.put(new float[]  {//Base
                                   -3f, 0f, -3f, 
                                   -3f, 2f, -3f,
                                    3f, 0f, -3f,
                                    
                                   -3f, 2f, -3f,
                                    3f, 2f, -3f,
                                    3f, 0f, -3f,
        
                                   -3f, 0f,  3f, 
                                   -3f, 2f,  3f,
                                    3f, 0f,  3f,
                                    
                                   -3f, 2f,  3f,
                                    3f, 2f,  3f,
                                    3f, 0f,  3f,
        
                                   -3f, 0f, -3f,
                                   -3f, 2f, -3f,
                                   -3f, 0f,  3f,
        
                                   -3f, 2f, -3f,
                                   -3f, 2f,  3f,
                                   -3f, 0f,  3f,
        
                                    3f, 0f, -3f,
                                    3f, 2f, -3f,
                                    3f, 0f,  3f,
        
                                    3f, 2f, -3f,
                                    3f, 2f,  3f,
                                    3f, 0f,  3f,
                                   
                                    3f, 2f,  3f,
                                   -3f, 2f,  3f,
                                   -3f, 2f, -3f,
        
                                   -3f, 2f, -3f,
                                    3f, 2f, -3f,
                                    3f, 2f,  3f,
                                   
                                    3f, 0f,  3f,
                                   -3f, 0f,  3f,
                                   -3f, 0f, -3f,
        
                                   -3f, 0f, -3f,
                                    3f, 0f, -3f,
                                    3f, 0f,  3f,
        
                                   //Tower
                                   -2f, 2f, -2f, 
                                   -2f, 9f, -2f,
                                    2f, 2f, -2f,
                                    
                                   -2f, 9f, -2f,
                                    2f, 9f, -2f,
                                    2f, 2f, -2f,
        
                                   -2f, 2f,  2f, 
                                   -2f, 9f,  2f,
                                    2f, 2f,  2f,
                                    
                                   -2f, 9f,  2f,
                                    2f, 9f,  2f,
                                    2f, 2f,  2f,
        
                                   -2f, 2f, -2f,
                                   -2f, 9f, -2f,
                                   -2f, 2f,  2f,
        
                                   -2f, 9f, -2f,
                                   -2f, 9f,  2f,
                                   -2f, 2f,  2f,
        
                                   //Top
                                   -2f,  9f, -2f,
                                    0f, 12f,  0f,
                                    2f,  9f, -2f,
                                    
                                   -2f,  9f,  2f,
                                    0f, 12f,  0f,
                                   -2f,  9f, -2f,
                                    
                                   -2f,  9f,  2f,
                                    0f, 12f,  0f,
                                    2f,  9f,  2f,
                                    
                                    2f,  9f,  2f,
                                    0f, 12f,  0f,
                                    2f,  9f, -2f});        
        normData.flip();*/
        
        vboidv = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboidv);
        glBufferData(GL_ARRAY_BUFFER, vertData, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        
        vboidc = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboidc);
        glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        
        //vboidn = glGenBuffers();
        //glBindBuffer(GL_ARRAY_BUFFER, vboidn);
        //glBufferData(GL_ARRAY_BUFFER, normData, GL_STATIC_DRAW);
        //glBindBuffer(GL_ARRAY_BUFFER, 0);
        
    }
    
    
    public static void drawVBO() {
        glPushMatrix();
        
        glEnableClientState(GL_VERTEX_ARRAY);
        glBindBuffer(GL_ARRAY_BUFFER, vboidv);
        glVertexPointer(vertSize, GL_FLOAT, 0, 0L);
        
        glEnableClientState(GL_COLOR_ARRAY);
        glBindBuffer(GL_ARRAY_BUFFER, vboidc);
        glVertexPointer(colorSize, GL_FLOAT, 0, 0L);
        
        //glEnableClientState(GL_NORMAL_ARRAY);
        //glBindBuffer(GL_ARRAY_BUFFER, vboidn);
        //glVertexPointer(vertSize, GL_FLOAT, 0, 0L);
       
        glDrawArrays(GL_TRIANGLES, 0, numVerts);
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
        glPopMatrix();
    }
    
    
    public static void cleanVBO() {
        glDeleteBuffers(vboidv);
        glDeleteBuffers(vboidc);
        //glDeleteBuffers(vboidn);
        glDeleteBuffers(vboids);
    }


The commented out normals data was added later to see if adding normals would fix it (it didn't) so I commented it back out for now.  Not that I understand how normals work or what values are valid for them (I understand a line being normal to a plane, but not to a point).  I'm totally at a loss as to what I'm doing wrong.

Cornix

Maybe you should start with a simpler shape when you try to work with your VBO's.
I just happen to have posted some of my own code recently (for a completely unrelated problem) and maybe you would like to have a look at that since I am using VBO's versus immediate mode there.
http://lwjgl.org/forum/index.php/topic,5169.0.html

Here is the code I used to create the VBO (a simple Quad with texture):
private void load_vbo() {
			int FLOAT_BYTE_SIZE = 4;
			/*
			 * Define vertices and indices used by the VBO:
			 */
			float[] vertices = new float[] {
					0, 0, 0,
					0, 0,
					0, 1, 0,
					0, 1,
					1, 1, 0,
					1, 1,
					1, 0, 0
					1, 0,
			};
			byte[] indices = new byte[] {
					0, 1, 2, 2, 3, 0
			};
			
			/*
			 * Create the vertex buffer; upload vertices into buffer.
			 */
			vbo_id = GL15.glGenBuffers();
			FloatBuffer vbo_buf = ByteBuffer.allocateDirect(vertices.length * FLOAT_BYTE_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
			vbo_buf.put(vertices);
			vbo_buf.flip();
			GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo_id);
			GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vbo_buf, GL15.GL_STATIC_DRAW);
			
			/*
			 * Create the index buffer; upload indices into buffer.
			 */
			ibo_id = GL15.glGenBuffers();
			ByteBuffer ibo_buf = ByteBuffer.allocateDirect(indices.length).order(ByteOrder.nativeOrder());
			ibo_buf.put(indices);
			ibo_buf.flip();
			GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ibo_id);
			GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, ibo_buf, GL15.GL_STATIC_DRAW);
			
			/*
			 * Make vbo ready for drawing:
			 */
			int POS_COUNT = 3;
			int TEXCOORD_COUNT = 2;
			int stride = (POS_COUNT + TEXCOORD_COUNT) * FLOAT_BYTE_SIZE;
			
			GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
			GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
			GL11.glVertexPointer(POS_COUNT, GL11.GL_FLOAT, stride, 0);
			GL11.glTexCoordPointer(TEXCOORD_COUNT, GL11.GL_FLOAT, stride, POS_COUNT * FLOAT_BYTE_SIZE);
		}
	}


And here is the code I used to render the VBO:
GL11.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_BYTE, 0);


Maybe this can help you out.

JaredBGreat

Thanks Cornix.  I simplified the code substatially, and still was at a loss until I noticed something.  As is often the case it came down to one really small and stupid little mistake on my part; cutting a pasting code to edit and missing part of the edit. I had:

glVertexPointer(colorSize, GL_FLOAT, 0, 0L);


...when I needed...

glColorPointer(colorSize, GL_FLOAT, 0, 0L);


Fixing this fixed the problem.