I've got multiple buffers in OpenGL holding data on position, normals and texcoords.

I also have an equal number of buffers holding distinct index data for each of those buffers.

I quite like this format (indvidual indexes for each buffer) utilised by COLLADA since it strikes me as optimally efficient at accessing each buffer.

I've set up pointers to the relevant data arrays using VertexPointer, NormalPointer, etc however I have no way to assign pointers to the index buffers since DrawElements appear to only look at one ElementArrayBuffer.

Can I utilise multiple indices some way or will I be better off using a different technique which can support this? I'd prefer to keep the distinct indices if at all possible.


3 Answers 3


You can have bound only one index array at a time. So you cann't use separate index array for each vertex attribute. So only choice is to rearrange all arrays according to one index array.

  • \$\begingroup\$ Ouch. I almost might as well not bother with the indices... I'll accept shortly failing any other suggestions. \$\endgroup\$
    – Rushyo
    Jun 19, 2011 at 20:07

I know this is really old, but for those googling.

I'm fairly sure you can just bind multiple EBO's to a single VAO.

(in OpenTK, but it would be something like this):


        // Vertices
        GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
        GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * Vertex.SizeInBytes), vertices, BufferUsageHint.StaticDraw);
        GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

        // Indices
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, ibo);
        GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * sizeof(uint)), indices, BufferUsageHint.StaticDraw);

        // Second lot of indices
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, ibo2);
        GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices2.Length * sizeof(float)), indices2, BufferUsageHint.StaticDraw);


        // Remember to unbind ebo AFTER vao, not before
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);

Now all you have to do is use the DrawElements function for each set of indices, or like The Fiddler said above use MultiDrawElements.


GL.MultiDrawElements should be able to do this. Check out the documentation for this function.

  • \$\begingroup\$ This can be used for more models (geometry), but not for attributes. Attributes of one model are using the same index array. \$\endgroup\$
    – zacharmarz
    Jun 22, 2011 at 11:50
  • \$\begingroup\$ My understanding of this method concurs with zacharmarz's statement. \$\endgroup\$
    – Rushyo
    Jun 22, 2011 at 12:26

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .