Nope, vertex shader input attributes cannot be objects. Attributes also don't have to be only vertex, color, or index. That link you posted shows deprecated functions glVertexPointer and glColorPointer. Those were the old ways of doing things. Now, OpenGL doesn't care what data is position or color, they're all inputs to your vertex shader! You control how the data is sent and processed, and how the output results.
This actually brings up a really rough spot with me. So I know that we are in the OpenGL 4.X range in terms of what is 'up to date'. I know that 2.1 and down is legacy. And Then 3.0 becomes all shaders (No more fixed function pipeline). So in your opinion ( or anyone that wants to weigh in on this) I kinda want to support legacy hardware, but do you think I should just skip them and go on to 3.0? I mean is it a big impact?
No worries on this, my plan was to use textured quads all along. Yea I'm seeing a lot of tutorials are in C++, nothing to bad. But still a bit of a pain to 'convert'
Traditionally, state in OpenGL has been global. And when I say "state", I'm talking about active textures, active buffers and so on. You can only have one VBO set as each active target, like GL_ARRAY_BUFFER and GL_ELEMENT_BUFFER, at any given time. So when using multiple buffers, you change the state for each target every time you need to render a different buffer. That means multiple calls to change state, which can become expensive.
VAOs allow you to make multiple state changes with one call. You associate a number of related VBOs (such as a vertex buffer and an index buffer) and their state with a VAO, then when its time to render you only activate the VAO. That way, you don't need to make multiple calls to set up the state of each VBO target. The best way to understand it is to avoid thinking of a VAO as an object (vertex array object is a horribly confusing name). Think of it more as a marker, or in index into an array of states.
In C or C++, you could do this. The memory layout of a struct (or C++ class) declared like your Vertex class would be the same as that of an array of six floats. So you could use an array of Vertex objects and call glVertexAttribPointer to set up the offsets for each attribute. Then you would wind up with what they call "interleaved buffers". In Java, you could declare a vertex class like this, but because of the nature of the OpenGL bindings like LWJGL, you still would have to fill a ByteBuffer with the individual values. You wouldn't be able to pass the object directly to OpenGL.
Dear god that is a horrible name... I thought these were separate objects the whole time
And the part about the struct, yeah I wish you could do this, when I made a SpriteBatcher in DX11 that was awesome. You can just pop them in on a Map call and you were good to go