Consider a single VBO (or perhaps multiple VBOs) filled with multiple objects, each with arbitrary vertex counts. For demonstrative purposes, let's say there's an apple, with 500 vertices, and an orange, with 650 vertices stored within a VBO.
Typically if I wanted to draw the orange, I'd just call glDrawRangeElements and indicate that I wanted to draw elements 500-1150. If I wanted the orange drawn in a specific position in space, I'd use a model transformation.
However, what if I wanted to draw potentially thousands of objects? Furthermore, what if the VBO contained hundrends, if not thousands of objects as a sort of "object library"? I'd prefer not to have to transmit what I want to be drawn to my GPU using immediate mode (that is, calling glDrawRangeElements manually for each object). This would add a great deal of costly overhead in communicating with the GPU.
What I'm looking for is some way to upload some sort of array with OpenGL in one go. This array would contain some sort of identifier for each object I want drawn, and perhaps a transformation for each (position, rotation). Thus, if I wanted to draw a sea of different fruits at arbitrary locations, I'd just calculate an index once and upload it. The array can be interleved. For instance, the array might look like this: [ object id 1 ], [ position 1 ], [ rotation 1 ] ... [ object id n ].