"Vertex buffer objects" (VBOs) are just vertex arrays in driver memory (server-side memory).
Originally Posted by CRasterImage
Whereas "client arrays" are just vertex arrays in application memory (client-side memory).
Sure. Sometimes you want glDrawElements. Sometimes you want glDrawArrays. If the latter, you don't need an index list.
Some examples used element arrays to index into the buffer, some did not.
Yeah, those are side issues. Totally separate from the where you store your vertex attribute arrays.
Some examples used VAOs, some did not.
Some used a vertex shader, some did not.
Not a lot is required. As before, you provide the Pointer calls a pointer to the first element in each vertex attribute array. And you specify a stride value != 0 so the GPU knows how to skip over the other attributes for this vertex to the next attribute value for this vtx attribute for the next vertex.
Now I am trying to get it setup so that it works with interleaved data....
For interleaved, what things are required and why?
More on pointer to the first element: 1) In the case of interleaved vtx attribute arrays in client arrays, you'd specify the actual starting CPU address of each vertex attribute for the pointer attribute. 2) In the case of interleaved vtx attribute arrays in VBOs, you'd specify the byte offset into the VBO for each vertex attribute for the pointer attribute (e.g. 0 = vertex, 12 = normal, etc.). and 3) In the case of NV bindless VBOs, you'd specify the GPU address for each vertex attribute for the pointer attribute.
Do you have to use a shader?
Nope. glDrawArrays*() calls work just fine without one. If you're using glDraw*Elements*(), then you should however.
Do you have to use an element array?
Do you have to use VAOs?
Above I'm assuming a compatibility profile (the default). If you're allocating a core profile, then the answers are Yes/No/Yes IIRC (as the core profile obsoletes the fixed-function pipeline and requires use of VAOs).