What are array indices? What's their advantage over vertex array data?r
#1 Members - Reputation: 109
Posted 07 August 2011 - 11:02 AM
Help is appreciated as usual!
EDIT: Sorry for the "?r" at the end of the title, just a typo...
#3 Members - Reputation: 109
Posted 07 August 2011 - 11:43 AM
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 Members - Reputation: 572
Posted 07 August 2011 - 11:52 AM
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
#7 Members - Reputation: 572
Posted 07 August 2011 - 01:19 PM
#8 Members - Reputation: 3828
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.






