Keine Anzeige von glDrawElements
Wenn ich mit glDrawArrays bekomme ich ein Dreieck in der Mitte von meinem Bildschirm, wie erwartet.
Aber wenn ich versuche, mit glDrawElements nichts kommt an alle.
Ich habe versucht, alle möglichen Dinge wie die Neuordnung der gl fordert, bewegen Sie den Zeiger-Attribut, und auch hart codieren, verts und index angezeigt wird, nichts zu tun, wie gezeigt, in meinem code.
Dieser code einmal ausgeführt:
//Initialise GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
//return -1;
}
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); //4x antialiasing
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); //We want OpenGL 3.3
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); //We don't want the old OpenGL
//Open a window and create its OpenGL context
if( !glfwOpenWindow( mApplication->getWindowWidth(), mApplication->getWindowHeight(), 0,0,0,0, 32,0, GLFW_WINDOW ) )
{
fprintf( stderr, "Failed to open GLFW window\n" );
glfwTerminate();
//return -1;
}
//Initialize GLEW
glewExperimental=true; //Needed in core profile
if (glewInit() != GLEW_OK)
{
fprintf( stderr, "Failed to initialize GLEW\n");
//return -1;
}
glfwSetWindowTitle( "Hello World" );
glViewport( 0, 0, mApplication->getWindowWidth(), mApplication->getWindowHeight());
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0.0f, 0.0f, 0.4f, 0.0f); //colour to use when clearing
Diese läuft jeden Schritt:
float verts[] = {
-0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
};
unsigned int index[] = {
1, 2, 3,
};
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
//VAO
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
//VBO
glGenBuffers(1, &VBO );
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts) * sizeof(float), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
//IBO
glGenBuffers(1, &IBO );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(index) * sizeof(unsigned int), index, GL_STATIC_DRAW);
glDrawArrays(GL_TRIANGLES, 0, 3); //this works
//glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &index); //this doesnt
glfwSwapBuffers();
Dies ist eine sehr abgespeckte version von dem, was ich versuche zu erreichen, aber das problem ist genau das gleiche.
So erstellen Sie Ihre VAO/VBOs jedes mal, wenn Sie zeichnen? Das ist nicht der Weg, es zu tun. Einmal erstellen.. dann ziehen.
ich habe gelesen, dass, und es sieht immer noch wie mein code ausgeführt werden soll.
ich habe gelesen, dass, und es sieht immer noch wie mein code ausgeführt werden soll.
InformationsquelleAutor Neros | 2013-06-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich nicht. Sie speichern Ihre Indizes in einem Puffer-Objekt. In der gleichen Weise die Letzte Zeiger-argument zu
glVertexAttribPointer
interpretiert wird als ein offset in der derzeit gebundenGL_ARRAY_BUFFER
(wenn man gebunden ist), der Letzte Zeiger-argument zuglDrawElements
interpretiert wird als ein offset in den Puffer, die derzeit gebundenGL_ELEMENT_ARRAY_BUFFER
. Sie schon richtig lagern, Ihre Indizes zu, so dass Sie haben, um zu sagen`glDrawElements
Sie, dass die Indizes beginnen bei offset 0 dieses Puffers, wie Sie esglVertexAttribPointer
:EDIT: Und wie bwroga betont in seiner Antwort, sollten Sie beginnen, Ihre Indizes mit
0
statt1
.EDIT: Und auch an die falschen Größen in
glBufferData
. Verwenden Siesizeof(verts) * sizeof(floats)
(und ebenso fürindex
), aberverts
ist ein array und diesizeof
ein array ist bereits die Größe des ganzen in bytes und nicht nur die Anzahl der Elemente, so sollte es ziemlich einfach seinsizeof(verts)
, da sonst dieglBufferData
versuchen, Daten zu Lesen, die über den tatsächlichen array-Größe, die ist Undefiniertes Verhalten (und in Ihrem Fall leider zu funktionieren scheint).EDIT: Und natürlich als Grimmy weist in seinem Kommentar, auf den Sie sollte nicht neu angelegt werden VAO und VBO jedes mal, wenn Sie ziehen, dass die Initialisierung Zeug. Aber das ist eher eine konzeptionelle/Optimierung Fehler (wenn auch schwere) eher als eine tatsächliche "non-working" - Fehler.
Denn das war, wie
glDrawElements
(undglVertexAttribPointer
) verwendet wurde, bevor VBOs ins Spiel kam.nullptr, was war der Schlüssel" - Aber immer noch nicht, ignorieren Sie die anderen Fehler, Sie sind gleich schwer.
nullptr
Was darauf hindeutet, dass Sie verwenden, anstatt 0 ist wahrscheinlich eine schlechte Idee. Es soll ein byte-offset; es ist nur ergriffen als Zeiger Wert. Wenn Sie möchten, verwenden Sie einen nicht-null-Wert, die Sie jetzt tun müssen, um eine Besetzung, die man getan haben sollte alle zusammen. Es ist am besten zu geben, das Beispiel, das die meisten einfach zu einem späteren Zeitpunkt ändern.Es ist immer noch ein pointer-argument, und falls ein offset angegeben werden muss als Zeiger sowieso. Da
3
würde nicht funktionieren (im Gegensatz zustatic_cast<const char*>(nullptr)+3
oderreinpterpret_cast<const void*>(3)
), halte ich0
counter-intuitive, zu. Vielleichtreinterpret_cast<const void*>(0)
tun würde, aber ich möchte vermeiden, dass. Aber vielleicht ist es ein problem des Standpunktes.nullptr
täuscht nicht über die Tatsache, dass es in Erster Linie ein pointer-argument eingegeben, egal wie es ist interpeted von der Funktion.InformationsquelleAutor Christian Rau
Denke ich:
sollte dies sein:
Getestet, keine Würfel.
InformationsquelleAutor bwroga
Ich würde anfangen, Ihren index auf null, wie andere haben darauf hingewiesen. Aber es gibt ein anderes problem das ich sehe...
sein sollte...
...als index ist ein array, es ist bereits ein Zeiger, keine Notwendigkeit für &.
InformationsquelleAutor Neil Roy