Absturz bei glViewport()

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Absturz bei glViewport()

    Hallo zusammen,

    mit einem Bekannten arbeite ich momentan (immer wenns die Zeit im Studium mal zulässt) an einer 3D - GameEngine, geschrieben in C++, gerendert wird mit OpenGL. Wir möchten gern plattformunabhängig entwickeln und haben uns daher für diese Variante entschieden.

    Bisher haben wir den Code nur unter Windows getestet, drum habe ich jetzt bei nem gewissen Volumen unserer bisherigen Klassen mal ein Projekt in Xcode 3.2.6 angelegt, bekomme es nun aber leider nicht zum Laufen, da die Anwendung kurz nach dem Start das Zeitliche segnet. Laut Callstack passiert der Absturz beim Aufruf von glViewport(), drum hab ich einfach mal hardcoded feste Werte als Parameter eingegeben, konnte aber auch damit kein anderes Verhalten erwirken.

    Gibts eventuell bestimmte Dinge, die ich bei der Entwicklung mit C++ und OpenGL unter Mac OS X beachten muss? Von dem besagten Problem hab' ich beim googeln auch den ein oder anderen Treffer erzielt. Allerdings ging es dort meist um die Nutzung des NSOpenGLViews und wir nutzen als Schnittstelle ja GLUT.

    Vielen Dank für eure Hilfe im Vorraus!
  • Poste mal den Code um glViewport und um glutInit herum.

    Btw.: Glut ist tot, insofern, ist das vielleicht eine günstige Gelegenheit, um auf NSOpenGLView et.al. umzusteigen. Schaut Euch noch die Apple-OpenGL Samples an, da könnt ihr schnell nachvollziehen, wie ihr am besten einen OpenGL-Kontext erstellt, ist kein Hexenwerk.
  • @mattik:
    Wir nutzen unter Mac OS denselben Code, daher denke ich zumindest, dass wir bei der Initialisierung alles korrekt gemacht haben. Was GLUT angeht, ja das wissen wir^^ Allerdings kommen wir, wenn wir plattformunabhängig entwicklen wollen, eben momentan nicht drum herum. Vielleicht muss ich mir wohl doch noch die Arbeit machen und Wrapperklassen schreiben X(

    @chartus:
    Nein, wir nutzen die reine OpenGL-Library nebst GLUT. glViewport() sollte doch im Standard enthalten sein oder??

    @Markus:
    Ja, stimmt schon. Allerdings geht uns dann, wie schon beschrieben die Unabhängigkeit verloren und wir müssten 2 Mal Code schreiben :-/

    Hier mal der Code:

    Wir erzeugen uns zunächst eine Instanz unserers EngineControllers:

    Quellcode

    1. engine = new EngineController();


    Diese erzeugt im Standardkonstruktor eine neue Instanz seiner window-Property:

    Quellcode

    1. EngineController::EngineController()
    2. {
    3. this->showAxis = false;
    4. this->window = new Window();
    5. ...
    6. }


    Im Standardkonstruktor des Fensters wird dann die Fenstergröße gesetzt:

    Quellcode

    1. Window::Window()
    2. {
    3. this->isCreated = false;
    4. this->setPosition(100, 100);
    5. this->setSize(640, 480);
    6. ...
    7. }


    wobei unsere viewport()-Methode aufgerufen wird:

    Quellcode

    1. void Window::setSize(int _width, int _height)
    2. {
    3. this->width = _width;
    4. this->height = _height;
    5. this->viewport();
    6. }


    und letztendlich die Zeile kommt, an der es "knallt:

    Quellcode

    1. void Window::viewport()
    2. {
    3. // Absturz der Anwendung
    4. glViewport(0, 0, (GLsizei)this->width, (GLsizei)this->height);
    5. }
  • Ja, das hört sich so an, als sei der Kontext noch nicht initialisiert, vermutlich läuft das glutInit über die runloop. Ein Grund mehr, das OpenGL-Kontextzeug in eine (dünne) Wrapperschicht zu packen. Gerde wenn ihr Platformunabhängig sein wollt, solltet ihr bedenken, dass es z.B. auf iOS kein GLUT gibt (aus gutem Grund). Gruß, Markus
  • @Wolfgang:
    Genau, glViewport() ist die erste Funktion, die wir aufrufen. Ich hab auch mal versucht das glutInit() davor zu setzen, allerdings führte das zum selben Ergebnis :-/ Was müsste ich denn ggf. noch an gl-Funktionen aufrufen, dass der Kontext hergestellt ist? Vielleicht stelle ich aber auch erstmal alles auf SDL um und hab dammit schon das Problem gelöst, wenn dieses mir die Arbeit abnimmt^^

    @mattik:
    Danke für den Tipp mit SDL, das war mir unbekannt! Bin ja auch noch recht neu in der OpenGL - "Branche" *g*

    @Markus:
    Ja, danke für den Hinweis! Cross-platform heißt für uns in erster Linie, dass wir auf Desktop-Systemen laufen wollen. Mobile Geräte kommen dann (vielleicht) später mal hinzu. :)
  • MArCus88 schrieb:

    @Wolfgang:
    Genau, glViewport() ist die erste Funktion, die wir aufrufen. Ich hab auch mal versucht das glutInit() davor zu setzen, allerdings führte das zum selben Ergebnis :-/ Was müsste ich denn ggf. noch an gl-Funktionen aufrufen, dass der Kontext hergestellt ist? Vielleicht stelle ich aber auch erstmal alles auf SDL um und hab dammit schon das Problem gelöst, wenn dieses mir die Arbeit abnimmt^^

    @mattik:
    Danke für den Tipp mit SDL, das war mir unbekannt! Bin ja auch noch recht neu in der OpenGL - "Branche" *g*

    @Markus:
    Ja, danke für den Hinweis! Cross-platform heißt für uns in erster Linie, dass wir auf Desktop-Systemen laufen wollen. Mobile Geräte kommen dann (vielleicht) später mal hinzu. :)
    Die glutInit muss auf jeden Fall davor stehen, das Ganze könnte so aussehen:

    Quellcode

    1. glutInit(&argc, argv);
    2. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    3. glutInitWindowSize(800, 600);
    4. glutCreateWindow("meine coole Engine");
    5. glutReshapeFunc(ChangeSize);
    6. glutKeyboardFunc(KeyPressFunc);
    7. glutDisplayFunc(RenderScene);



    Hole dir mal hier die sourcen von der OpenGL-Super Bible (Mac Code)
    starstonesoftware.com/OpenGL/fourthEdition.htm


    der macht das auch mit GLUT, dann siehst du zumindest die Reihenfolge der Initialisierung.

    Ich muss mich aber meinen Vorrednern anschließen, vergiss GLUT (ist schon ewig tot) und nimm nen die nativen Sachen