Problems with OpenGL VBOs

Hello, I’ve made a basic corridor using immediate OpenGL drawing and I want to transfer it to VBOs. However, it just doesn’t work. The immediate drawing works fine, yet I tried to make it using VBOs and it doesn’t work. Here is what I am trying to create:

And here is the code that I used for that:

		GL11.glColor3f(1F, 0F, 0F);
		GL11.glVertex3f(0.5F, 1.5F, 1.0F);
		GL11.glColor3f(0F, 1F, 0F);
		GL11.glVertex3f(0.5F, 1.5F, -15.0F);
		GL11.glColor3f(0F, 0F, 1F);
		GL11.glVertex3f(0.5F, -1.5F, -15.0F);
		GL11.glColor3f(0.5F, 0.5F, 0.5F);
		GL11.glVertex3f(0.5F, -1.5F, 1.0F);

Yet when I try to use VBOs for the same thing, it doesn’t work and I just get a black window. Here is my class to create is using VBOs.

import java.nio.FloatBuffer;

import org.lwjgl.*;
import org.lwjgl.opengl.*;
import org.lwjgl.util.glu.GLU;

import static org.lwjgl.opengl.ARBBufferObject.*;
import static org.lwjgl.opengl.ARBVertexBufferObject.*;
import static org.lwjgl.opengl.GL11.*;

public class VBO {
	
	static int w = 640;
	static int h = 480;

	public static void main(String[] args) {
		try {
			initWindow();
			renderLoop();
		} catch (LWJGLException e) {
			e.printStackTrace();
		}
	}

	static void initWindow() throws LWJGLException {
		Display.setDisplayMode(new DisplayMode(w, h));
		Display.setFullscreen(false);
		Display.create();

		glViewport(0, 0, w, h);
	}

	static void renderLoop() {
		while (!Display.isCloseRequested()) {
			preRender();
			render();

			Display.update();
			Display.sync(20);
		}
		Display.destroy();
	}

	static void preRender() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
				| GL_STENCIL_BUFFER_BIT);

		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();

		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
	}

	static void render() {
		glClearColor(1, 1, 1, 1);
		glLoadIdentity();
		glBegin(7);
		drawVertexArray();
	}

	static void drawVertexArray() {
		FloatBuffer cBuffer = BufferUtils.createFloatBuffer(12);
		cBuffer.put(1).put(0).put(0);
		cBuffer.put(0).put(1).put(0);
		cBuffer.put(0).put(0).put(1);
		cBuffer.put(0.5F).put(0.5F).put(0.5F);
		cBuffer.flip();

		FloatBuffer vBuffer = BufferUtils.createFloatBuffer(12);
		vBuffer.put(0.5F).put(1.5f).put(1.0f);
		vBuffer.put(0.5f).put(1.5f).put(-15.0f);
		vBuffer.put(0.5f).put(-1.5f).put(-15.0f);
		vBuffer.put(0.5f).put(-1.5f).put(1.0f);
		vBuffer.flip();
		
		glEnableClientState(GL_VERTEX_ARRAY);
		glEnableClientState(GL_COLOR_ARRAY);

		glColorPointer(4, /* stride */4 << 2, cBuffer);
		glVertexPointer(4, /* stride */4 << 2, vBuffer);
		glDrawArrays(GL_QUADS, 0, /* elements */4);

		glDisableClientState(GL_COLOR_ARRAY);
		glDisableClientState(GL_VERTEX_ARRAY);
	}
}

It looks like you are doing vertex arrays and not VBOs. The dead give away is the lack of a VBO id or any glBuffer stuffs.

Look at the LWJGL for some tutorials on using VBOs but I would get vertex arrays working first as they are almost VBOs.

Since you are not interleaving your vertex array, you should have not have a stride or offsets.

Also, you may want to do thing outside the static context.

Thanks :stuck_out_tongue: I was half-reading a tutorial but I was trying to do my own way at the same time :stuck_out_tongue: I’ll look up on vertex arrays some more - thanks.

Your element size and strides don’t make any sense in glColorPointer and glVertexPointer. In both cases, your element size is 3 (red/green/blue and x/y/z). Since each consecutive attribute immediately follows the previous, your stride should be 0 (not 4 << 2, which is 16 btw).

You might want to take a look at my article on the subject: