So I'm dabbling in game design for a bit, and am trying to get some 3d models onto the screen without using any deprecated OpenGL features. Obviously that means no fixed functionality, so no glTexCoord or glVertex; everything's in vertex buffer objects now.
This however causes a new problem; as far as I can tell when rendering from a VBO you only pass a single index buffer object that refers to one VBO or a single set of equally sized (same amount of indices) VBOs.
Now, with fixed functionality I could have a set of 3d vertices, a set of texture vertices and a set of triangles that each consisted of 3 indices to 3d vertices and 3 indices for texture vertices (for each UV layer). This way, you generally end up with less 3d and texture vertices than faces.
With VBOs however since apparently you can pass only one index for each vertex, each vertex that has different texture coordinates (on any layer) now has to be a unique vertex. If you have more than one UV layer, that's going to be practically every vertex. So, I guess I could just make 3 whole new vertices for each triangle. (i.e. the index buffer object would look like [0,1,2,3,4,5,6,7,8,9,10...], just passing each vertex in order)
This seems like a waste of memory space though; for a regular sized model (say, 10000 triangles) that would mean 30000 vertices; at 12 floating point numbers per vertex that would mean a single model would take up over 1MB of video memory!
So my question is basically, is there any alternative to just making a whole new vertex for every point on a triangle that has one property (be it any texture coordinate or even normal direction) different from all other vertices? (at which point each triangle might as well have their own vertices since there will be very few shared vertices anyway, especially when working with disjointed lightmaps) Maybe some way to pass more than one index when rendering from VBOs?
Or, a bit more generally, what is a good format to store a model in video memory?