Question

I have created a Vertex Buffer Object containing only vertices for triangles, for drawing with the GL_TRIANGLES option. My VBO has no color information because I change the color every frame.

Now I'm trying to draw individual triangles in a loop after setting the default vertex color like this in every iteration:

glColor4f(red, green, blue, 1);

But I'm not sure how to perform the actual drawing.

Must I use glDrawArrays if I want to pick one or two triangles out of the VBO to draw them with a specific color, or must I use glDrawElements?

Is there a more efficient way to set the color for each triangle in the VBO and then draw it? Or is it fine to call glColor44 and glDrawArrays in a loop for every frame?

Was it helpful?

Solution

First of all, I would rather suggest to ignore the slightly higher memory cost and just store a color with each vertex inside the VBO and therefore just duplicate the triangle's color for each of the triangle's vertices (you cannot set per-triangle colors). This will most probably be much more efficient than drawing single triangles in a loop. Keep in mind that the advantage of VBOs is not only their possible GPU storage, but also the fact that you don't need driver calls for each and every triangle or even vertex. So just duplicate your per-triangle colors into per-vertex colors and draw everything with a single call to glDrawArrays (glDrawElements won't buy you much if you need to duplicate almost every vertex anyway, which makes indices just useless).

Said that, you can of course draw individual triangles with glDrawArrays, that's what the first and count parameters are for. So if you have a VBO containing the 9 vertices of 3 triangles, just call

glDrawArrays(GL_TRIANGLES, 3, 3);

to draw only the 2nd triangle. That easy. And likewise can you use the count and offset parameters of glDrawElements to select a particular part of the index array to draw.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top