2016-03-25 8 views
0

Ich bin ein VBO zu schaffen, mit Daten bevölkern, dann werden diese Daten aufbereitet wird mit dem folgenden Code:Reihenfolge der Argumente in glBindBuffer

// Buffer data 
glGenBuffers(1, &VBOID); 
glBindBuffer(VBOID, GL_ARRAY_BUFFER); // Shouldn't these be the other way around? 
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW); 
glVertexPointer(3, GL_FLOAT, 0, buffer); 

// Draw arrays 
glBindBuffer(VBOID, GL_ARRAY_BUFFER); 
glEnableClientState(GL_VERTEX_ARRAY); 
glDrawArrays(GL_TRIANGLES, 0, bufferSize); 
glDisableClientState(GL_VERTEX_ARRAY); 

jedoch die openGL Referenz (https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml) sagt, dass die glBindBuffer Funktion nimmt den Zieltyp des Puffers, dann die Puffer-ID, nicht umgekehrt. Wenn ich sie auf diese Weise umgebe, zieht nichts auf den Bildschirm, aber wenn sie "falsch" herum sind, scheint es gut zu funktionieren.

Zur Klarstellung:

// Should be this 
glBindBuffer(GL_ARRAY_BUFFER, VBOID); 
// Only this works 
glBindBuffer(VBOID, GL_ARRAY_BUFFER); 

ich so das Gefühl einer jener wirklich dumm Fragen, aber ich kann einfach nicht sehen, wo das Problem ist. Könnte jemand die Situation beleuchten?

Danke.

glBindBuffer(GL_ARRAY_BUFFER, VBOID); 

ich nicht erklären kann, warum Ergebnisse in erfolgreiche Zeichnung diese Argumente Umkehren:

Antwort

0

es auf jeden Fall wie folgt geschrieben werden sollte. Allerdings gibt es ein paar Seltsamkeiten, die Sie in Ihrem Code haben, die Sie überarbeiten müssen:

glVertexPointer(3, GL_FLOAT, 0, buffer); 

Dies ist sofort Moduscode. Ich glaube nicht, es ist veraltet, aber der richtige Weg, dies ist

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr); 

Hinzu kommt, dass zu schreiben, Sie zwei Referenzen haben staatlich zu Einstellung Client glEnableClientState(GL_VERTEX_ARRAY); und glDisableClientState(GL_VERTEX_ARRAY); -Diese sind ebenfalls Teil des unmittelbaren Modus, und sollte entfernt werden.

Schließlich sollte das Ganze in einem Vertex-Array-Objekt eingewickelt werden, etwa so:

glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

glGenBuffers(1, &VBOID); 
glBindBuffer(GL_ARRAY_BUFFER, VBOID); 
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr); 
glEnableVertexAttribArray(0); 

// Draw arrays 
glBindVertexArray(vao); 
glDrawArrays(GL_TRIANGLES, 0, num_of_vertices); //num_of_vertices is usually the number of floats in the buffer divided by the number of dimensions of the vertex, or 3 in this case, since each vertex is a vec3 object. 
+0

Ah, danke. Du weißt nie, das könnte einen Unterschied machen. Was speziell qualifiziert unmittelbaren Modus? Ich dachte, es wäre nur Geometrie gezeichnet mit glBegin() und glEnd()? – ipe369

+0

'glVertexPointer' ist definitiv veraltet, zusammen mit' glColorPointer', 'glNormalPointer' und dem Rest der festen Pipeline-Attribute. –

Verwandte Themen