Ich habe die Shape::draw() Methode jetzt mal wie folgt überarbeitet:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void Shape::draw(){
std::cout << "1" << std::endl;
glBindVertexArray(VBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOID);
std::cout << "2" << std::endl;
glDrawElements(GL_TRIANGLES, 3 * numElements, GL_UNSIGNED_SHORT, NULL);
std::cout << "3" << std::endl;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
GLenum err = glGetError();
if(err != GL_NO_ERROR){
std::cout << "Err: " << err << std::endl;
}
}
|
Nach dem Zeichnen des ersten Elements wird "Err: 1280" ausgegeben, was GL_INVALID_ENUM entsprechen müsste.
Das VAO auch IBO bindings speichern war mir nicht klar. Ich werde das mal dahingehend überarbeiten.
Wie genau werden eigentlich VBO's und IBO's mit VAO's verknüpft? Reicht es VBO'S und IBO's einmal zu binden, während ein VAO eingebunden ist?
Warum die "glGenBuffers" Aufrufe nicht im Konstruktor stehen kann ich auch nicht mehr sagen. Ich habe mich vor ein paar Tagen aus meiner Wohnung ausgesperrt und während ich gewartet habe lange darüber nachgdacht. Irgendeinen Grund hatte ich dafür, was genau habe ich aber total vergessen. Jetzt würde ich aber auf jdenen Fall sagen, dass du recht hast. Das macht im Konstruktor viel mehr Sinn. Das werde ich auch nochmal überarbeiten.
Was das ablegen der Shape Objekte auf dem Stack angeht würde ich dir erstmal wiedersprechen. Mal angenommen ich würde sie in der createArrow Methode auf dem Stack anlegen. Wenn ich das Objekt jetzt zurück gebe läuft es mit der schließenden Klammer in der nächsten Zeile doch out-of-Scope. Damit wäre der Inhalt des Objektes, das im Window ankommt undefiniert. Wahrscheinlich würde zwar noch das Shape Objekt im Speicher liegen, aber davon kann ich doch nicht augehen. Auch wenn ich damit das Risiko für Speicherlecks erhöhe sehe ich keinen anderen Weg als den Heap zu nutzen.
Edit:
Das einbinden des VBO's als VAO war anscheinend das Problem. Ein verdammter Buchstabe. Oh man.
Danke für den Hinweis.