2012-04-09 3 views
0

Я видел много информации о сокращении вызовов openGL, но я недостаточно разбираюсь в конвейере. Можете ли вы настроить VBO полностью головой времени? В частности, используя этот example, он устанавливает VBO, а затем каждый кадр вызывает настройку включения/указателя до вызова рисования. Можно ли полностью настроить VBO с настройкой включения/указателя при его создании?OpenGL VBO setup

Что-то вроде этого

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, а затем, какие бы вершинные или буферы элементов, с которых вы связываете, становятся ассоциированными с буфером массива. Отвяжите буфер массива, когда закончите. Затем, чтобы использовать буфер массива, автоматически настраивая указатели, просто привяжите буфер массива. – Robinson

ответ

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

Да.

Ни один из атрибутов не разрешает и gl*Pointer вызывает изменение объекта буфера сам. Вы не указываете буферному объекту, что он используется для позиций и нормалей. Подумайте о том, что объект-буфер является не чем иным, как бессмысленным байтовым массивом.

Звонки gl*Pointer говорят OpenGL, как интерпретировать этот массив байтов. Они не привязаны к буферу. Они не изменяют буфер. Они просто говорят OpenGL, где можно найти определенные данные в определенном буфере.

Если вы хотите сохранить эти настройки и сбросить их позже, вам понадобится vertex array object.