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);
}
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.
Yep, that fixed it. Thank you so much.