Jump to content
  • Advertisement
Sign in to follow this  
AutoBot

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

This topic is 2536 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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...

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.)

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
this also helps the GPU speed wise, because it can cache results from the same vertex index in the Post Transform Cache.

Share this post


Link to post
Share on other sites
Ah, I can see how that would work now. So should I use glDrawElements most of the time? Or does glDrawArrays have advantages too?

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
Okay, this really clears things up. Not much speculation about how this is supposed to work now.

Thanks for the great help everybody!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!