VBO acts weird after switching to short indices

Started by Marltoro, April 07, 2013, 22:41:32

Previous topic - Next topic

Marltoro

I created a vertex buffer object that works fine when I use byte for the indices type. However, after switching to short indices the object is rendered incorrectly and the program runs extremely slowly. I have to use short indices because I'm going to be rendering heightmaps which requires a larger type than byte indices. Can anyone determine what's wrong with my code? I have a function that initializes the VBO and a function that renders the VBO.

// INSTANCE VARIABLES
float testRot = 180.0f;
int VBObuffer[] = new int[2];
	
// BUFFERS
ShortBuffer indicesBuffer = BufferUtils.createShortBuffer(8);
FloatBuffer verticesBuffer = BufferUtils.createFloatBuffer(24);
	
public void initVBO()
{
	// VERTICES
	// TOP
	verticesBuffer.put(-50.0f);verticesBuffer.put(50.0f);verticesBuffer.put(100.0f);
	verticesBuffer.put(50.0f);verticesBuffer.put(50.0f);verticesBuffer.put(100.0f);
	verticesBuffer.put(-50.0f);verticesBuffer.put(-50.0f);verticesBuffer.put(100.0f);
	verticesBuffer.put(50.0f);verticesBuffer.put(-50.0f);verticesBuffer.put(100.0f);
	// RIGHT
	verticesBuffer.put(50.0f);verticesBuffer.put(-50.0f);verticesBuffer.put(0.0f);
	verticesBuffer.put(50.0f);verticesBuffer.put(50.0f);verticesBuffer.put(0.0f);
	verticesBuffer.put(50.0f);verticesBuffer.put(-50.0f);verticesBuffer.put(100.0f);
	verticesBuffer.put(50.0f);verticesBuffer.put(50.0f);verticesBuffer.put(100.0f);
	// setup vertices
	verticesBuffer.flip();
		
	// INDICES
	// TOP
	indicesBuffer.put((short)0);
	indicesBuffer.put((short)1);
	indicesBuffer.put((short)2);
	indicesBuffer.put((short)3);
	// RIGHT
	indicesBuffer.put((short)4);
	indicesBuffer.put((short)6);
	indicesBuffer.put((short)5);
	indicesBuffer.put((short)7);
	// setup indices
	indicesBuffer.flip();
		
	// vertices and indices
	VBObuffer[0] = glGenBuffers();
	VBObuffer[1] = glGenBuffers();
		
	// setup vertice buffer
	glBindBuffer(GL_ARRAY_BUFFER, VBObuffer[0]);
	glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
		
	// setup vertices
	glVertexPointer(3, GL_FLOAT, 0, 0);
		
	// setup indice buffer
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBObuffer[1]);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);
}
	
public void renderVBO()
{
	// ENABLE SETTINGS
	glEnableClientState(GL_VERTEX_ARRAY);
		
	// PUSH MATRIX
	glPushMatrix();
	glRotatef(testRot, 1.0f, 0.0f, 0.0f);
		
	// TOP
	glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
	// RIGHT
	glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 4);
		
	// POP MATRIX
	glPopMatrix();
		
	// DISABLE SETTINGS
	glDisableClientState(GL_VERTEX_ARRAY);
}

quew8

The offset in glDrawElements is measured in bytes. (It is unclear as hell I know). There are 2 (I think) bytes per short so change the second one to 8. Obviously, since there is only one byte per float, you wouldn't have realized using UNSINGNED_BYTE.

Marltoro