OpenGL 3.2 keine Bildausgabe

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

  • Du musst unbedingt auf OpenGL-Fehler prüfen.
    Dann gab es noch einen Konflikt mit dem CoreProfile-Header. Wenn Du dieses verwendest, darfst Du OpenGL.h nicht includen, sondern gl3.h. Leider erfolgt das im precompiled-header in der Voreinstellen (in Cocoa/Cocoa.h <- daran erkennt man, dass modernes OpenGL keine Priorität bei Apple hat), hier die korrigierte .pch Datei sowie ein Makro, welches auf OpenGL-Fehler prüft (selbstverständlich gehört das nicht in den precompiled header sondern in einen separaten Header, welcher in allen OpenGL verwendenden Modulen inkludiert wird).

    Quellcode

    1. #ifdef __OBJC__
    2. #import <OpenGL/gl3.h>
    3. #import <Cocoa/Cocoa.h>
    4. #endif
    5. static NSString* ReportGLError( GLuint error )
    6. {
    7. switch ( error ) {
    8. case GL_INVALID_ENUM:
    9. return @"Invalid enum";
    10. break;
    11. case GL_INVALID_VALUE:
    12. return @"Invalid value";
    13. break;
    14. case GL_INVALID_OPERATION:
    15. return @"Invalid operation";
    16. break;
    17. case GL_OUT_OF_MEMORY:
    18. return @"Out of memory";
    19. break;
    20. case GL_NO_ERROR:
    21. return @"No error";
    22. break;
    23. case GL_INVALID_FRAMEBUFFER_OPERATION:
    24. return @"Invalid framebuffer operation";
    25. break;
    26. default:
    27. return @"Unknown error";
    28. break;
    29. }
    30. }
    31. #define CHECK_FOR_GLERRORS { GLuint error; while ( ( error = glGetError() ) != GL_NO_ERROR ) { \
    32. NSAssert( error == GL_NO_ERROR, @"OpenGL Error: %@", ReportGLError(error) ); \
    33. } \
    34. }
    Alles anzeigen

    glGenVertexArraysApple brauchst Du nicht zu verwenden, nimm direkt glGenVertexArrays, das funktioniert seit mindestens 10.6.3.
    Im Anhang noch das korrigierte Beispielprojekt.

    Beste Grüße, Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Markus Müller ()

  • Danke!! Danke!! Danke!!
    Danke!! Danke!! Danke!!
    Danke!! Danke!! Danke!!

    Nochmal eine Frage.
    Wie ändert man es so, dass das Dreieck immer in gleichen Propertionen dargestellt wird?
    Ich will verhindern, dass wenn man das Fenster in die Breite streckt, sich auch das Dreieck streckt ohne sich in der Höhe zu verändern.
  • ist doch nicht so schwer, sich die notwendige Matrix dafuer zu ueberlegen. Dann einfach in den Shader rein und gut.

    Wenn Du dir so eine einfache Matrix nicht ohne weiteres fix herleiten kannst, empfehle ich Dir, ein wenig Dein Mathe aufzufrischen. Das koennen wir hier nicht auch noch machen...
    C++
  • Oh, Du bist Schueler, und in der Schule lernt man ja nichts mehr. Darum ein paar Hinweise:

    Schau Dir mal de.wikipedia.org/wiki/Homogene_Koordinaten
    Da sind auch die wichtigsten Matrizen aufgefuehrt.

    Du willlst ja alle Deine Punkte skalieren entlang einer Achse, um ein korrektes Aspect Ratio zu wahren. Schreib Dir einfach die Punkte mal auf ein Blatt Papier (nimm als vierte Koordinate in den Punkten jeweils 1)
    Dann nimm eine einfache skalierungs-Matrix, und multiplizier die mit jedem der Punkte. Mach das. Wenn Du nicht weisst, wie das geht, liess nach, ist nicht schwer.
    Dann findest Du sicherlich, wie Du sx,sy,sz waehlen kannst, um dein Dreieck entlang der einen oder anderen Achse stauchen zu koennen.
    C++
  • Ja, denke schon.
    Skalierungsmatrix hat ja nur drei "nennenswerte" Eintraege, (sx,sy,sz) - die Skalierung entlang der Achsen.
    In die Tiefe willst Du nichts skalieren, also ist sz=1.
    Dann kannst Du sx=1 setzen und sy so waehlen, dass Dein Aspect Ratio korrekt ist.

    In Deinem einfachen 2D Fall sollte das mehr als ausreichen.
    C++
  • Ich kenn mich nicht wirklich mit "normalen" Array aus.
    Wieso funktioniert dieser Code nicht?

    Quellcode

    1. GLfloat MVP[16] = [MatrixManager identityMatrix]; // Fehler: Array initializer must be an initializer list
    2. glUniformMatrix4fv(uiMatrixID, 1, GL_FALSE, &MVP[0]);
    3. + (GLfloat *)identityMatrix
    4. {
    5. GLfloat newMatrix[16] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0};
    6. GLfloat *identityMatrix = newMatrix;
    7. return identityMatrix;
    8. }
    Alles anzeigen
  • Ich verstehe das mit dem Matrix Multiplizieren noch nicht ganz.
    Ich meine jetzt das Multiplizieren von Matrizen, nicht von Matrix und Vertex.
    Die Theorie verstehe ich, verschieben und rotieren != rotieren und verschieben.
    Aber ist es nicht bei einer Multiplikation egal, in welcher Reihenfolge die Faktoren stehen?
    Und ist es bei Verschiebungen nicht sinnvoller Addition zu verwenden?
  • Es macht einen Unterschied, in welcher Reihenfolge Du die Rotationen ausführst (siehe 3D-Grundlagenbuch, kannst Du auch ganz leicht selber mit einem Würfel nachvollziehen). Der Vorteil der 4D-Matrizen ist, dass Du Rotation, Translation sowie Skalierung mit einer einzigen Matrix-Vektormultiplikation ausführen kannst.
  • Und wie schreibt man dann eine Klasse, die Matritzen multiplizieren kann?
    Rein logisch kann man bei einer Multiplikation die Faktoren beliebig vertauschen.

    Und z.B. wenn in der einen Matrix eine Verschiebung ist und in der anderen nicht, dann wird diese bei der Multiplikation aufgelöst, oder?
    Weil in der zweiten Matrix die Verschiebung 0 ist und 0 * 60 = 0.

    Quellcode

    1. 1.0 0.0 0.0 60.0 2.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0
    2. 0.0 1.0 0.0 45.0 * 0.0 2.0 0.0 0.0 = 0.0 2.0 0.0 0.0
    3. 0.0 0.0 1.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 0.0
    4. 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0