2012-04-09 4 views
0

J'ai vu beaucoup d'informations sur la réduction des appels vers OpenGL, mais je ne comprends pas assez bien le pipeline. Pouvez-vous mettre en place la VBO complètement à la tête du temps? Spécifiquement en utilisant ce example, il configure le VBO et chaque trame appelle la configuration d'activation/pointeur avant l'appel draw. Le VBO peut-il être complètement configuré avec l'activation/le pointeur quand il est créé?Configuration OpenGL VBO

Quelque chose comme ça

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

Générez et liez le tampon de tableau d'abord dans la fonction init, puis les tampons de vertex ou d'élément que vous liez depuis sont associés au tampon de tableau. Délier le tampon de tableau lorsque vous avez terminé. Ensuite, pour utiliser le tampon de tableau, en configurant automatiquement les pointeurs, il suffit de lier le tampon de tableau. – Robinson

Répondre

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

Oui.

Aucun de l'attribut ne l'active et gl*Pointer appels modifient l'objet tampon lui-même. Vous ne dites pas à l'objet tampon qu'il est utilisé pour les positions et les normales. Considérez l'objet tampon comme rien de plus qu'un tableau d'octets muets.

Les appels gl*Pointer indiquent à OpenGL comment interpréter ce tableau d'octets. Ils ne sont pas attachés à un tampon. Ils ne modifient pas le tampon. Ils indiquent simplement à OpenGL où trouver certaines données dans un tampon particulier.

Si vous souhaitez stocker ces paramètres et les réinitialiser ultérieurement, vous avez besoin d'un vertex array object.