2012-04-09 118 views
0

我已经看到了很多有关减少对openGL调用的信息,但我不太了解这个管道。你能设置VBO完全的时间吗?具体使用这个example,它设置VBO,然后每个帧在绘制调用之前调用启用/指针设置。 VBO在创建时是否可以通过启用/指针设置完成设置?OpenGL VBO设置

像这样的事情

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)); 

... 
} 
+0

首先在init func中生成并绑定数组缓冲区,然后从此绑定的任何顶点或元素缓冲区都将与数组缓冲区关联。完成后取消绑定阵列缓冲区。然后使用数组缓冲区,自动设置指针,只需绑定数组缓冲区。 – Robinson 2012-04-09 15:42:53

回答

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

是。

没有属性启用和gl*Pointer调用修改缓冲对象本身。您不会告诉缓冲区对象它正在用于位置和法线。将缓冲区对象视为无用的字节数组。

gl*Pointer调用告诉OpenGL如何解释该字节数组。他们没有附加到缓冲区。他们不修改缓冲区。他们只是告诉OpenGL在哪里找到特定缓冲区内的某些数据。

如果您想存储这些设置并稍后重置它们,则需要使用vertex array object