vbbartlett
vbbartlett

Reputation: 179

OpenGL VBO setup

I have seen a lot of information about reducing the calls to openGL, but I don't understand the pipeline well enough. Can you set up the VBO completely head of time? Specifically using this example, it sets up the VBO and then each frame calls the enabling/pointer setup prior to the draw call. Can the VBO be completely set up with the enabling/pointer setup when it is created?

Something like this

 Data_Init_Func(...)
 {
 ....

 glGenBuffers(1, &IndexVBOID);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
 short pindices[YYY];
 pindices[0]=0;
 pindices[1]=5;
 //etc...
 offsetInByte=0;
 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offsetInByte, SizeInBytes, pindices);

 glGenBuffers(1, VertexVBOID);
 glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
 glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);4

 //data creation and binding
 ...

 // Normally it seems like this code is PER FRAME... DOES IT NEED TO BE?
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_NORMAL_ARRAY); 
 glVertexPointer(3, GL_FLOAT, 64, BUFFER_OFFSET(0));
 glNormalPointer(GL_FLOAT, 64, BUFFER_OFFSET(12));
 glClientActiveTexture(GL_TEXTURE0);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);    //Notice that after we call            
 glClientActiveTexture, we enable the array
 glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(24));
 glClientActiveTexture(GL_TEXTURE1);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);    //Notice that after we call
 glClientActiveTexture, we enable the array
 glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(32));
 glClientActiveTexture(GL_TEXTURE2);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);    //Notice that after we call
 glClientActiveTexture, we enable the array
 glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(40));
 ...
 }

 Draw(...)
 {
 glBindBuffer(GL_ARRAY_BUFFER_ARB, VertexVBOID);         // for vertex coordinates
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); // for indices

 // DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE?

 // draw 6 quads using offset of index array
 glDrawRangeElements(GL_TRIANGLES, x, y, z, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));

 ...
 }

Upvotes: 0

Views: 877

Answers (1)

Nicol Bolas
Nicol Bolas

Reputation: 473174

// DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE?

Yes.

None of the attribute enables and gl*Pointer calls modify the buffer object itself. You don't tell the buffer object that it's being used for positions and normals. Think of the buffer object as nothing more than a dumb byte array.

The gl*Pointer calls tell OpenGL how to interpret that byte array. They are not attached to a buffer. They don't modify the buffer. They simply tell OpenGL where to find certain data within a particular buffer.

If you want to store these settings and reset them later, you need a vertex array object.

Upvotes: 1

Related Questions