I’m using a VBO with an interleaved array to render a obj (model format) iv loaded. Is this possible to do with a vector instead? The GL code works with using a vector but the offset for a vector of vectors is going to be quite different. So the buffer doesn’t step through the vector correctly. Therefore renders nothing but is created.
So my normal code for a VBO is(with some irrelevant bits missed out):
#define BUFFER_OFFSET(bytes) ( (GLubyte*) NULL + (bytes) )
//define interleaved array
GLfloat Cubedata[12][4] =
{
//tu tv Cr Cg Cb Ca Nx Ny Nz Vx Vy Vz
+0.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, +0.5f, +0.5f,//top left 0
+0.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, -0.5f, +0.5f,//bottom left 1
+1.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, -0.5f, +0.5f,//bottom right 2
+1.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, +0.5f, +0.5f //top right 3
};
//define other stuff
//create vbo
glGenBuffersARB(2, VBOid); //generates ids for the buffers
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOid[0]);//specifes the current buffer object
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ( (4 * 12) * sizeof(GLfloat) ), *Cubedata, GL_STATIC_DRAW_ARB);
glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, BUFFER_OFFSET(0) );//set offsets
//bind indicies
//bind current buffer, render
this works perfectly for an array of GLfloat type but with a vector of GLfloat it doesnt. The vector definition needs to have twelve columns and nth rows such as:
vector< vector<GLfloat> > vec_interleaved(12,vector<GLfloat>(4) );
so getting to the point of my question, how do you calculate the offset for a vector? in this case I want the buffer to start reading from every 12 elements / the start of every row.
Simply, you can’t.
The vector of vectors is essentially storing a vector of pointers to memory elsewhere, and is therefore not contiguous and cannot be offset.
You will need to use a multi-dimensional array; as you are already.