Ich habe einen Beispielcode, der einen VBO mit einem Dreieck initialisiert und dann rendert.Sollte es Verhalten Verhalten für VBO vs unmittelbaren Modus (glBegin/glEnd) geben?
Mein Haupt rendering loop ist:
// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt( x, 1.0f, z,
x+lx, 1.0f, z+lz,
0.0f, 1.0f, 0.0f);
// Draw ground
glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
glVertex3f(-100.0f, 0.0f, -100.0f);
glVertex3f(-100.0f, 0.0f, 100.0f);
glVertex3f(100.0f, 0.0f, 100.0f);
glVertex3f(100.0f, 0.0f, -100.0f);
glEnd();
// draw triangle
glColor3f(0.9f, 0.2f, 0.1f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
if(vboTest) vboTest->draw();
/* The above ->draw() would be equivalent
to the following immediate mode
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f, 0.2f, -1.0f);
glVertex3f(-1.0f, 0.2f, 1.0f);
glVertex3f(1.0f, 0.2f, 1.0f);
glEnd();*/
Die enthaltenen Daten in vboTest wird oben mit genau den gleichen Werten wie der kommentierten Code initialisiert, aber dann, wenn I mache es mit dem Code folgenden
// bind vertexes and indexes
glBindBuffer(GL_ARRAY_BUFFER, vbos_[0]); // vertexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos_[2]); // indexes
// do same as vertex array except pointer
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr
// draw n_tris_ triangles using offset of index array
glDrawElements(GL_TRIANGLES, n_vertex_, GL_UNSIGNED_INT, 0);
// deactivate vertex array
glDisableClientState(GL_VERTEX_ARRAY);
// bind with 0, so, switch back to normal pointer operation
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
Das Dreieck scheint sich zu drehen, ist aber verformt während des Spinnens.
Natürlich, wenn ich den sofortigen Modus Code oben verwenden soll, kann ich ein spinnendes Dreieck ohne Probleme sehen.
Soll VBO sich nicht semantisch gleichwertig verhalten sofort mode? Was mache ich falsch?