OpenGl Problem Hilfe



  • Hey ich hab ml wieder n Problem.

    Ich schreib momentan n Programm, was ich für n Projekt für die Schule machen muss.

    Eigentlich funktioniert alles auch soweit, nur Sobald ich von dem Fenstermodus in den Vollbildmodus wechsele stürtzt es ab.

    Der Debugger zeigt folgendes:

    Ausnahme ausgelöst bei 0x00000000572A3600 (nvoglv64.dll) in Paper Car.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000000000000.
    
    Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.
    

    und zeigt dabei auf diese Zeile

    glDrawElements(GL_TRIANGLES, this->indicies.size(), GL_UNSIGNED_INT, 0);
    

    .

    Ich weiß das ist nicht sehr informativ, nur weiß ich jetzt nicht was ich noch alles angeben sollte. Also bitte einfach nachfragen.

    Kann mir das jemand erklären, weil wenn ich das Programm normal starte(ist es im Fenstermodus) und dann in den Vollbildmodus wechsele dann stürtzt es an der Stelle ab.

    Danke im Vorr aus



  • 1234567890 schrieb:

    glDrawElements(GL_TRIANGLES, this->indicies.size(), GL_UNSIGNED_INT, 0);
    

    Was ist denn der letzte Parameter von glDrawElements() ? Der Nullpointer bei Dir.



  • Könntest du das nochmal anders formulieren, so verstehe ich das nicht.
    War das eine Frage?



  • Hast du auch einen GL_ELEMENT_ARRAY_BUFFER gebunden?



  • 1234567890 schrieb:

    Könntest du das nochmal anders formulieren, so verstehe ich das nicht.
    War das eine Frage?

    Naja: eine rhetorische Frage zumindest.

    Ich habe in die Doku von glDrawElements() geschaut, und ein Nullpointer dahinten ergibt keinen Sinn.

    glDrawElements(GL_TRIANGLES, this->indicies.size(), GL_UNSIGNED_INT, 0);
    

    Siehst Du das auch so?



  • Herr Schwurbel. Das ist ein sehr guter Hinweis. Nur warum stürzt das Programm dann nicht auch schon im Fenstermodus ab?



  • Furble Wurble schrieb:

    Ich habe in die Doku von glDrawElements() geschaut, und ein Nullpointer dahinten ergibt keinen Sinn.

    glDrawElements(GL_TRIANGLES, this->indicies.size(), GL_UNSIGNED_INT, 0);
    

    Siehst Du das auch so?

    Die OpenGL Doku ist in dem Fall etwas irreleitend, da der Parameter eine andere Bedeutung bekommt wenn man VBOs verwendet:

    https://www.opengl.org/sdk/docs/man4/html/glBindBuffer.xhtml schrieb:

    While a non-zero buffer object is bound to the GL_ELEMENT_ARRAY_BUFFER target, the indices parameter of glDrawElements, glDrawElementsInstanced, glDrawElementsBaseVertex, glDrawRangeElements, glDrawRangeElementsBaseVertex, glMultiDrawElements, or glMultiDrawElementsBaseVertex is interpreted as an offset within the buffer object measured in basic machine units.

    Als Offset ist die 0 schon korrekt.

    Das führt aber zu der Frage wie in den Fullscreen Modus gewechselt wird und ob danach der Buffer noch gebunden ist. Wenn nicht, wird es tatsächlich als Adresse interpretiert und sorgt für den Fehler.



  • Spannend. 🙂



  • Also danke für die vielen Antworten erstmal.

    Ja ich nutzte VAOs, daher der Nullpointer. Nachdem ich in den Vollbild Wechsele passiert nichts anderes als das ein neues Fenster erzeugt wird. Die VAO wird in einer Klasse gebunden, welche beim wechseln in den Vollbildmodus nicht zerstört wird, also ist das VAO immernoch gebunden. Also komm ich auf den Schluss das das erstellen des Fensters den Buffer Löscht.

    GWindow.create(sf::VideoMode(Screen_X_Size, Screen_Y_Size, 64), "Paper Car", sf::Style::Close, sf::ContextSettings(24, 8, 4, 3, 0));
    

    Sobald ich das auskommentiere Funtioniert es nach der Vollbildtaste noch.
    Arbeite mit sfml sollte dazu noh gesagt sein.



  • Erzeugt das auch einen neuen Context!? Wenn ja musst du vermutlich alle Ressourcen (VAOs, Buffer, Textures, Shader, ...) neu erzeugen...



  • Auch wenn das Seperat in einer Klasse gespeichert ist?



  • Der OpenGL Context ist an den jeweiligen Thread gebunden (ja, OpenGL ist stellenweise ziemlicher Bullshit). In welcher Klasse irgendwelche Objekte gehalten werden ist OpenGL (leider) völlig egal...



  • Okay, weil ja es wird ein neues Fenser erzeugt... Daher denke ich auch das die Context Settings neu gemacht werden.

    Wie kann ich das dann sichern, ohne das Objekt nochmal komplett neu laden zu müssen?



  • 1234567890 schrieb:

    Wie kann ich das dann sichern, ohne das Objekt nochmal komplett neu laden zu müssen?

    Gar nicht.



  • Dann wie kann ich in den vollbildmodus ohne einen neuen Context zu erzeugen?



  • Rein prinzipiell wäre das kein Problem, SFML unterstützt das aber offenbar leider nicht...



  • Okay, dann hab ich hier n ziemlich großes Problem...



  • Habs gelöst, dachte ich muss das ganze modell neu laden, denn das hätte ca. ne sekunde gedauert, aber ich musste ja nur die buffers neu binden und dabei waren die werte noch gespeichert.

    Danke, habt mir sehr geholfen


Anmelden zum Antworten