Hello,
I have a question according to the use of glDrawRangeElements. I set up a vbo and ibo and uploaded vertex and index data to draw a simple cube. When
I call glDrawRangeElements(GL_TRIANGLES, 0, 2, 3)
then i draws the first triangle. So far so good. But
when I call glDrawRangeElements(GL_TRIANGLES, 3, 5, 3)
also the first triangle is draw instead of the second.
But when I call glDrawRangeElements(GL_TRIANGLE, 0, 5, 6)
it draws both triangles.
I use opengl 3.2 core profile.
So my vertex struct is
struct Vertex
{
float position[3]; // size: 12
float normal[3]; // size: 12
float texcoord[3]; // size: 12
float color[4]; // size: 16
};
Makes a size of 52 bytes on my computer. I set up
8 vertices for the cube from 0,0,0 to 1,1,1. Each face of
the cube consists of 2 triangles. So my indices are
GLuint idx[] = {0,1,2,
0,2,3,
4,5,6,
4,6,7,
0,4,7,
0,7,3,
1,5,6,
1,6,2,
3,2,6,
3,6,7,
0,1,5,
0,5,4
};
I update the vbo and ibo as follows
/* bind buffers buffer */
glBindBufferARB(GL_ARRAY_BUFFER, vertexbufferId);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, indexbufferId);
/* init buffers, allocate memory */
glBufferDataARB(GL_ARRAY_BUFFER, vbSize, NULL, vbUsage);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, ibSize, NULL, ibUsage);
/* unbind buffers */
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
/* bind buffer */
glBindBufferARB(GL_ARRAY_BUFFER, vertexbufferId);
/* map pointer */
float* ptr = (float*)glMapBuffer(GL_ARRAY_BUFFER,GL_WRITE_ONLY);
if(ptr)
{
/* copy data */
:memcpy(&ptr[offset], vertices, size);
/* unmap buffer */
glUnmapBuffer(GL_ARRAY_BUFFER);
}
/* unbind buffer */
glBindBufferARB(GL_ARRAY_BUFFER, 0);
/* bind buffer */
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbufferId);
/* mappointer */
GLuint* ptr = (GLuint*)glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
if(ptr)
{
/* update index */
::memcpy(&ptr[offset], index, size);
/* unmap buffer */
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
}
/* unbind buffer */
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
drawing the vbo
glBindBuffer(GL_ARRAY_BUFFER, vertexbufferId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbufferId);
glDrawRangeElements(GL_TRIANGLES, 3, 5, 3, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
So, actually the vertices and indices are there. But I dont
understand why I can draw all vertices but not a specific
range.
What made I wrong ?
regards,
lobbel