2012-04-09 8 views
0

Ich habe eine Menge Informationen über die Reduzierung der Aufrufe von OpenGL gesehen, aber ich verstehe die Pipeline nicht gut genug. Kannst du den VBO ganz schön spät einrichten? Speziell unter Verwendung dieser example, richtet es die VBO und dann jedes Frame ruft die Aktivierung/Zeiger-Setup vor dem Zeichenaufruf. Kann der VBO vollständig mit dem Aktivieren/Zeiger-Setup eingerichtet werden, wenn er erstellt wird?OpenGL VBO-Setup

So etwas wie dieses

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

Generieren und binden Sie den Array-Puffer zuerst in der init-Funktion, dann werden die Vertex- oder Elementpuffer, von denen Sie binden, mit dem Array-Puffer verknüpft. Entbinden Sie den Array-Puffer, wenn Sie fertig sind. Um dann den Array-Puffer zu verwenden und die Zeiger automatisch einzurichten, binden Sie einfach den Array-Puffer. – Robinson

Antwort

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

Ja.

Keines der Attribute aktiviert und gl*Pointer Aufrufe ändern das Pufferobjekt selbst. Sie sagen dem Pufferobjekt nicht, dass es für Positionen und Normalen verwendet wird. Stellen Sie sich das Pufferobjekt als nichts anderes vor als ein dummes Byte-Array.

Die Aufrufe gl*Pointer weisen OpenGL an, wie dieses Bytearray zu interpretieren ist. Sie sind nicht an einen Puffer gebunden. Sie ändern den Puffer nicht. Sie teilen OpenGL einfach mit, wo bestimmte Daten in einem bestimmten Puffer zu finden sind. Wenn Sie diese Einstellungen speichern und später zurücksetzen möchten, benötigen Sie einen vertex array object.