Vertex Buffer Woe [FIXED]

Started by Moridin, December 28, 2010, 13:37:22

Previous topic - Next topic

Moridin

Hello,

I'm currently porting this tutorial to LWJGL : http://www.arcsynthesis.org/gltut/Basics/Tutorial%2001.html

Everything seems to be going fine, i can create and load the Shaders without issue, but when i go to draw the triangle on the screen, it remains black with no visible triangle.

Some code fragments :

Create the VBO :
package com.maoni.shaders.util;

import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import static org.lwjgl.opengl.GL15.*;

public enum InitializeVertexBuffer {
	INSTANCE,
	;
	
	public int createPositionBufferObject(float vertices[]) {
		int positionBufferObject = glGenBuffers();
		FloatBuffer fb = BufferUtils.createFloatBuffer(vertices.length);
		fb.put(vertices);
		fb.flip();
		
		glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
		glBufferData(positionBufferObject, fb, GL_STATIC_DRAW);
		glBindBuffer(GL_ARRAY_BUFFER, 0);
			
		return positionBufferObject;
	}
}


Initialise the Shaders etc :
private static void init() {
		try {
			int width = 800;
			int height = 600;
			
			Display.setDisplayMode(new DisplayMode(width, height));
			Display.setVSyncEnabled(true);
			Display.setTitle("Maoni V0.01");
			Display.create();
			
			// Setup the shader program
			shaderList.add(CreateShader.VERTEX.load(_VERTEX_SHADER_LOCATION));
			shaderList.add(CreateShader.FRAGMENT.load(_FRAGMENT_SHADER_LOCATION));
			_PROGRAM = CreateProgram.INSTANCE.create(shaderList);
			
			// Setup the PositionBufferObject
			_PBO = InitializeVertexBuffer.INSTANCE.createPositionBufferObject(vertexPositions);
			
			glViewport(0, 0, width, height);
		} catch (LWJGLException e) {
			e.printStackTrace();
		}
	}


And then try and Draw it :
private static void render() {
		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		

		glUseProgram(_PROGRAM);

		glBindBuffer(GL_ARRAY_BUFFER, _PBO);
		glEnableVertexAttribArray(0);
		glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
		glDrawArrays(GL_TRIANGLES, 0, 3);

		glDisableVertexAttribArray(0);
		glUseProgram(0);
		
		Display.update();
	}



The whole code is listed here :

https://github.com/Almclean/Maoni

If anyone could point me in the right direction i would be very grateful.

Many thanks,
M

Moridin

Ok so a lot of reading the opengl superbible later and i've finally got my first lwjgl triangle on the screen.  Hardly Crysis 3 but here's what i did so that's its documented for future opengl newbies.

So first off, I swapped the lwjgl.jar for lwjgl-debug.jar.  This threw up an exception in the Vertex buffer init code.  The main problem was here :

glBufferData(positionBufferObject, fb, GL_STATIC_DRAW);
//should be
glBufferData(GL_ARRAY_BUFFER, fb, GL_STATIC_DRAW);


So i wasn't actually putting data into the array buffer properly...oops.

The second main bit was the fact that i didn't create and initialise a Vertex Array Object, so i added :

// Create the Vao
vao = glGenVertexArrays();
glBindVertexArray(vao);


To create one.  Without this, the superbible informs me, all VBO-specific calls will fail and nothing will get drawn.

So i've checked the code into Github, take a look and i hope you find it useful.

Onward with OpenGL 3.x !

M