Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
8 replies to this topic

#1 AutoBot   Members   -  Reputation: 109

Like
0Likes
Like

Posted 07 August 2011 - 11:02 AM

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

Sponsor:

#2 zacaj   Members   -  Reputation: 643

Like
1Likes
Like

Posted 07 August 2011 - 11:19 AM

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

#3 AutoBot   Members   -  Reputation: 109

Like
0Likes
Like

Posted 07 August 2011 - 11:43 AM

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

#4 zacaj   Members   -  Reputation: 643

Like
1Likes
Like

Posted 07 August 2011 - 11:52 AM

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

#5 Danny02   Members   -  Reputation: 275

Like
1Likes
Like

Posted 07 August 2011 - 12:00 PM

this also helps the GPU speed wise, because it can cache results from the same vertex index in the Post Transform Cache.

#6 AutoBot   Members   -  Reputation: 109

Like
0Likes
Like

Posted 07 August 2011 - 01:15 PM

Ah, I can see how that would work now. So should I use glDrawElements most of the time? Or does glDrawArrays have advantages too?

#7 zacaj   Members   -  Reputation: 643

Like
1Likes
Like

Posted 07 August 2011 - 01:19 PM

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?

#8 mhagain   Crossbones+   -  Reputation: 7833

Like
2Likes
Like

Posted 07 August 2011 - 04:59 PM

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.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#9 AutoBot   Members   -  Reputation: 109

Like
0Likes
Like

Posted 07 August 2011 - 09:21 PM

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

Thanks for the great help everybody!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS