C [OpenGL] Benötige Unterstützung beim Übergang von OpenGL 2.x auf 3.2+

Photon

Commodore
Registriert
Apr. 2006
Beiträge
5.036
Hallo Community,

ich habe in der Weihnachtszeit etwas Freizeit gehabt und damit begonnen eine kleines Programm, das die Effekte der speziellen Relativitätstheorie visualisiert, auf aktuellere Bibliotheken zu portieren, damit es auch auf einem aktuellen PC ausführbar wird. Das Programm ist zuletzt 2001 aktualisiert worden und verwendete als GUI-Toolkit GTK, ich konnte es nun auf GTK2 portieren und bin gerade im Port auf GTK3 hängen geblieben. Das Problem ist nun nämlich, dass der ganze GL-Code nicht mehr funktioniert, da GTK3 die neue OpenGL-API (3.2 und höher, aktuell haben wir 4.6) benötigt und die keinerlei Kompatibilität zu der in dem Programm verwendeten alten API hat.

Nun habe ich im Netz nach "migration guides" gesucht aber leider nichts gefunden. Das Einzige, das ich finden konnte, sind die Dokumentationen der alten und neuen API. Bevor ich Stunden und Tage investiere, um beide APIs zu lernen und den vorhandenen Code zu verstehen: Hat vielleicht jemand Tipps, wie man den Prozess weniger schmerzhaft gestalten könnte, Links zu Lesestoff, der bei so einer Migration hilfreich wäre usw.?

Vielen Dank im Voraus!
Photon
 
Ich denke nicht, dass es da einen Migration Path gibt, denn da wurde altes Zeug entfernt und neues hinzugefügt, sodass Dinge dann auch anders umgesetzt werden mussten.

Auf welchem Stand ist der OpenGL Code denn überhaupt? Bei 2001 vermutlich kleiner als Version 2 und damit kannst du eine Migration sogesehen vergessen, da OpenGL 1.x auf Fixed Function Pipelines arbeitet und ab 2.x mit Programmable Pipelines (Shaders etc.). Die Arbeitsweise von OpenGL hat sich da m.W. einfach grundlegend geändert zwischen den Versionen.
 
  • Gefällt mir
Reaktionen: Photon
Vermutlich ein Rewrite des OpenGL Codes. Vertex und Fragment Shader brauchst du ohnehin um überhaupt etwas anzeigen zu können und die DrawLists sind durch VertexBufferObjects sowie VertexArrayObjects zu ersetzen, wenn ich mich nicht irre. Habe OpenGL 1.x auch schon ewig nicht mehr angefasst :D Es wird soweit ich das sehe praktisch ein neues Programm.

Woran scheitert es denn mit GTK3 und OpenGL eigentlich? Baut es nicht mehr, weil irgendwas seitens GTK jetzt fehlt oder läuft es nicht mehr?
 
  • Gefällt mir
Reaktionen: BeBur
Ich musste ein paar Sachen rausnehmen, insbesondere die komplette ogl_draw_string()-Funktion und deren Aufrufe (die aber nicht lebenswichtig ist, da sie nur Textausgaben über die OpenGL-Ausgabe legt), sowie Aufrufe von gtk_gl_area_swap_buffers(), und habe es dadurch so weit, dass es kompiliert, linkt und startet. Aber das fragliche Widget, das ja die eigentliche Visualisierung zeigen soll, bleibt schwarz und OpenGL schmeißt Fehlercodes 1280 und 1282...
 
OpenGL ist (in der Praxis) abwärtskompatibel, Du kannst auch auf einem OpenGL 4 "Compatibility" Kontext noch OpenGL 1.1 Methoden aufrufen. Das sollte ja nicht das Problem sein -- Du wirst nur eben einen neuen Kontext erstellen müssen mit OpenGL 3.x Methoden und ansonsten sollte alles genauso weiter laufen (die Extension dafür -- GL_ARB_compatibility -- wird überall unterstützt.) Siehe auch: https://www.khronos.org/opengl/wiki/OpenGL_Context, Stichwort GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
 
Zuletzt bearbeitet:
Das klingt ganz toll, aber ich verstehe nur Bahnhof. :D Ich habe aber Folgendes versucht:
C:
gtk_gl_area_set_required_version(area, 3, 0)
und bekam als Ausgabe

Code:
Gdk-WARNING **: 15:44:40.894: gdk_gl_context_set_required_version - GL context versions less than 3.2 are not supported.

GTK3 kann also nur mit Version 3.2 oder höher, 3.0 ist ihm zu alt. Oder meintest du was anderes?
 
Du brauchst zwei Dinge:
  • Einen Kontext mit OpenGL >= 3.2 (weil Dein GTK das will)
  • Einen Compatibility Kontext (damit Du Dein OpenGL 1.1 Zeug laufen lassen kannst)

Ich sehe jetzt auf die schnelle nicht, wie Du mit GTK einen GL 3.2 Compatibility Context erstellst, aber es kann sein, dass Du einen automatisch bekommst und dann passt alles (einfach Version 3.2 verlangen und schauen was kommt.) Ansonsten musst Du den von Hand erstellen. Laut Doku kannst Du das mittels: https://developer-old.gnome.org/gtk3/unstable/GtkGLArea.html#GtkGLArea-create-context

Da würde ich ansetzen und einen Compatibility Context erstellen, dann sollte alles genauso weiterlaufen wie bisher.
Ergänzung ()

Suche gerade nach besserer Doku, und nach der letzten offiziellen Doku sieht so aus als hätte GTK3 das Signal nicht mehr? https://docs.gtk.org/gdk3/class.GLContext.html Vlt. kannst Du das hier nutzen: https://docs.gtk.org/gdk3/method.GLContext.set_forward_compatible.html und explizit NICHT forward compatible anfragen?
 
Zuletzt bearbeitet:
Hmm, die erste Antwort von https://stackoverflow.com/questions/37909072/gtkglarea-unable-to-create-opengl-2-1-context sagt:
You are not allowed to select a legacy context by yourself, because it's not possible to share core profiles with legacy ones, and GDK creates GL contexts internally for drawing.
Mit dem Autor hab ich heute übrigens schon geschrieben und er meinte, man muss den Code neu schreiben: https://github.com/ebassi/glarea-example/issues/2#issuecomment-1006473195
 
Das ist aber schöner Quatsch. Ein 3.2 Compatibility Context ist ja trotzdem OpenGL 3.2 kompatibel, nur haste halt auch noch alles was deprecated wurde drin. Aber ja, wenn die Dich keinen eigenen Kontext reinstopfen lassen, kannst Du nur auf GL 3.2 portieren, wie bereits geschrieben ist das aber ein kompletter Rewrite (weil Shader und so.)
 
Also, so weit ich Dich verstehe, ist das eine künstliche Beschränkung seitens GTK3, gegen die man aber nichts unternehmen kann, und somit ist der Rewrite die einzige Option, stimmt das so in etwa?
 
Ja, genau. Lustigerweise hat die Hardware ja eh kein glBegin und Immediate Mode etc., sprich der Treiber hat schon fertige Shader um OpenGL 2.x auf Shader umzubiegen, und die hättest Du bekommen beim Compatibility Kontext. Aber so wirst Du ermuntert das alles selber zu schreiben. Macht sicher für jemanden bei GTK Sinn :)
 
Zuletzt bearbeitet:
Anteru schrieb:
Macht sicher für jemanden beim GTK Sinn :)
Nun, für den Autor der obigen Antwort sicherlich, immerhin ist er Mitglied des Gnome-Entwicklerteams, ich wär nicht überrascht, wenn er an dieser Designentscheidung beteiligt wäre. ;) Heißt aber für mich: Alles neu schreiben, fragt sich nur, wie fange ich überhaupt an...

edit: Mir kommt da noch eine Sache: Er schrieb in https://github.com/ebassi/glarea-example/issues/2#issuecomment-1006507786

GTK3 (and GTK4) default to core GL 3.2+ context profiles, and disable deprecated/legacy GL support—unless the GL driver only supports legacy GL, in which case you'll get a GL 3.0 context.
Also wenn man GTK irgendwie vorgaukeln könnte, dass der Treiber nur Legacy-GL unterstützt, würde man einen 3.0 Kontext bekommen. :D
 
Zuletzt bearbeitet:
Mit einem OpenGL 2.0 oder 3.x Tutorial. Sprich so Sachen von 2013: https://www.cs.utexas.edu/~fussell/courses/cs384g-fall2013/lectures/lectureXX-OpenGL.pdf

Was Du brauchst ist ...

  • Buffer in die Du die Vertex-Daten steckst
  • Vertex-Binding um die Vertex-Daten in den Vertex Shader zu kriegen
  • Einen Vertex Shader
  • Einen Fragment Shader
  • Möglicherweise noch ein paar Uniforms

Das ist alles nicht so dramatisch, und der Rest ist wie in OpenGL 1.x (also was den State angeht). Da wäre es aber eventuell sinnvoll einen OpenGL 4.5 Kontext anzufragen, weil Du dann direkt mit glCreate und so arbeiten kannst, statt dem altmodischen glGen Zeug. Das ist tatsächlich weniger Aufwand.
Ergänzung ()

Einen OpenGL Treiber der kein OpenGL 3.2 kann gibt es aber nicht für aktuelle Hardware. OpenGL 3.2 konnten die Treiber schon vor 8 Jahren ...
 
  • Gefällt mir
Reaktionen: BeBur
Einen OpenGL Treiber der kein OpenGL 3.2 kann gibt es aber nicht für aktuelle Hardware. OpenGL 3.2 konnten die Treiber schon vor 8 Jahren ...
Klar, ich meinte eher so etwas wie eine environmental variable setzen, die die Info über die OpenGL-Version enthält, auf einen Wert, der der tatsächlichen Version des Treibers natürlich nicht entspricht.
Anteru schrieb:
Was Du brauchst ist ...
Danke, dann hab ich schon mal einen Startpunkt, wo ich ansetzen kann. Jetzt werde ich das Projekt wohl erst mal aufs Eis legen, weil die Ferien bald rum sind und ich noch eine ganze Schulaufgabe korrigieren muss. :) Aber die nächsten Ferien kommen bestimmt!
 
Zurück
Oben