What are array indices? What's their advantage over vertex array data?r

Started by
7 comments, last by AutoBot 12 years, 8 months ago
I've been reading the OpenGL 3.3 spec, and there's a part at section 2.8.3 that's been stumping me. The DrawArrays functions are fairly self explanatory, I can imagine binding vertex arrays and rendering them. But when I got to the DrawElements functions I started getting confused, since I don't have much of an idea of what they mean by indices... Are they just pointers to the vertex array data, instead of copies? If that's the case, then what are the "index offsets" used for in the indices parameter?

Help is appreciated as usual!

EDIT: Sorry for the "?r" at the end of the title, just a typo...
Advertisement
Indices are just numbers. (plural of index). And index of 0 would correspond to the first vertex, 5 would be the sixth, etc. That way, you only have to send unique vertices to the GPU, since most vertices are shared by more than one face
Alright, this makes a bit more sense now. But then what exactly is the difference between glDrawArrays and glDrawElements? Wouldn't calling:

glDrawArrays(mode, first, count)

be the same as calling:

glDrawElements(mode, count, UNSIGNED_INT, &first)?

(Except for the type parameter, I'm not sure why glDrawArrays doesn't implement one of these.)
The last parameter of elements isnt anything from arrays, its an array of unsigned ints, the order of the vertices to draw
for instance:
With glDrawArrays:
vertices:
-1,-1
-1,1
1,1
1,1
1,-1
-1,-1
glDrawArrays(GL_TRIANGLES,0,6)
With glDrawElements
vertices:
-1,-1
-1,1
1,1
1,-1
indices:(unsigned int[6])
0,1,2 ,2,3,0
glDrawElements(GL_TRIANGLES,6,UNSIGNED_INT,indices);
The indices correspond to the numbers of the vertices
this also helps the GPU speed wise, because it can cache results from the same vertex index in the Post Transform Cache.
Ah, I can see how that would work now. So should I use glDrawElements most of the time? Or does glDrawArrays have advantages too?
It depends on the GPU partially, because some might be more optimized for a certain type, but you cant easily control for that. Basically, just keep in mind: a vertex is 3/4 floats, and each float is 4 bytes, and unsigned int is 4 bytes(you could also use shorts or chars, if you have a simpler model). Just think when youre programming each thing: In general, which will take less space?

It depends on the GPU partially, because some might be more optimized for a certain type, but you cant easily control for that. Basically, just keep in mind: a vertex is 3/4 floats, and each float is 4 bytes, and unsigned int is 4 bytes(you could also use shorts or chars, if you have a simpler model). Just think when youre programming each thing: In general, which will take less space?


It's not just about storage; in fact storage saving is probably the smallest advantage of using indexes and even if you do end up using more storage the tradeoff may still be more than worth it. (And you should never use unsigned char for indexes because you'll drop back to software emulation - no hardware supports it.)

Big advantage number 1: your hardware's vertex cache will actually work now. This only happens if using indexes.

Big advantage number 2: you can concatenate multiple polygons into a single draw call. If you have, say, n tristrips each of which shares the same state and properties, rather than having to issue multiple draw calls for each strip (or use degenerate triangles - yuck) you can use indexes to draw them all in a single glDrawElements call.

Big advantage number 3: ID software (since Quake 3) use glDrawElements for (almost) everything, and consumer hardware vendors tend to optimize their OpenGL drivers around what ID software does, making glDrawElements more likely to be the fast path.

Still some reasons to use glDrawArrays though. If you're drawing a single triangle (or multiple discrete triangles with no shared verts) glDrawArrays makes more sense. Otherwise look at glDrawElements.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

Okay, this really clears things up. Not much speculation about how this is supposed to work now.

Thanks for the great help everybody!

This topic is closed to new replies.

Advertisement