Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

09.07.2014, 19:28

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.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Gnoccy« (09.07.2014, 19:43)


12

09.07.2014, 20:10

Probierst du bitte mal unsigned ints als Indices zu benutzen? Dann eben auch GL_UNSIGNED_INT als entsprechendes Enum. Ich hatte auf einer Grafikkarte einmal den seltsamen Fehler, den du beschreibst, welcher sich allerdings mit Integern dann wie von selbst behoben hat.

13

09.07.2014, 21:05

Wie gesagt, das Segfault Problem ist gelöst. Es lag an der Verwechslung vom VAO mit dem VBO.

Allerdings läuft es immer nocht nicht wie es soll. Es wird nur das Element gezeichnet, dass ich zuerst erzeuge.

So wird nur das Dreieck gezeichnet:

C-/C++-Quelltext

1
2
3
4
5
    Shape* tri = ShapeGenerator::createTriangle(positionLoc, colorLoc);
    Shape* arrow = ShapeGenerator::createArrow(positionLoc, colorLoc);

    shapes.push_back(arrow);
    shapes.push_back(tri);


Und so nur der Pfeil:

C-/C++-Quelltext

1
2
3
4
5
    Shape* arrow = ShapeGenerator::createArrow(positionLoc, colorLoc);
    Shape* tri = ShapeGenerator::createTriangle(positionLoc, colorLoc);

    shapes.push_back(arrow);
    shapes.push_back(tri);


OK, man kann schon dämlich sein. Da hab ich doch den selben Fehler zwei mal gemacht.
Danke an alle die mir geholfen haben. :thumbsup:

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Gnoccy« (09.07.2014, 21:18)


Werbeanzeige