OpenGL Context erzeugen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

OpenGL Context erzeugen

Beitrag von Traude »

Hallo,

Zu diesem Thema gab es schonmal einen Thread, aber da war keine Lösung für mich dabei, und vielleicht hat sich in der Zwischenzeit was geändert:

Ich möchte in Lazarus unter Linux einen OpenGL-Rendering Context aufsetzen.
Mein System: Ubuntu 8.04, Lazarus 0.9.26, FreePascal 2.2, WidgetSet=GTK2

Die Lazarus-OpenGL-Komponente möchte ich nicht benutzen, denn ich bekomme dort meinen RC nicht zu Gesicht und kann daher auch nicht bestimmen, wie er erstellt wird.

Eine solche Komponente selber zu schreiben trau ich mir nicht zu, dazu weiß ich zu wenig über die LCL oder auch GTK Bescheid.

Und SDL kann ich nicht benutzen, denn ich möchte eine Anwendung von Windows nach Linux portieren, die mehrere Fenster braucht.

Gibt es noch eine andere Möglichkeit? Ich frage deshalb hier bei Euch, weil einer von Euch glScene nach Lazarus portiert hat, und dort muss ja auch ein RC erzeugt werden. Ich hab eine Version davon (ist aber schon ein halbes Jahr alt) und da gibt es eine Unit GlLinuxContext, aber die scheint nur für QT zu sein und ist außerdem noch nicht ganz implementiert. Daran sollte es aber nicht scheitern, denn für OpenGL würde ich auch das Widgetset wechseln. Und wenn Not am Mann ist, kann ich auch nicht implementierte Sachen ergänzen, denn wenn es nur OpenGL betrifft, kenn ich mich ein wenig besser aus.

Derzeit schaffe ich es zwar, einen RC zu erzeugen, aber nur mit dem nackten X11 Server, also ohne LCL.
Viele Grüße,
Traude

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL Context erzeugen

Beitrag von Scotty »

GLScene gibt es für Delphi, Freepascal, Windows, Linux und was weiß ich nicht alles. Funktioniert auch einwandfrei, etwas Einarbeitung und schon gibt es OpenGL. Allerdings ist Deine Frage etwas unspezifisch. Hast Du die Komponenten in der Palette, sprich: Alles richtig installiert? Willst Du visuell arbeiten oder alles selbst erzeugen? Hast Du Dir die (sehr guten) Beispiele angesehen?
Ansonsten noch ein paar Tipps: Das GLScene-Forum ist zwar schlecht besucht, aber trotzdem eine gute Hilfe http://www.glscene.de/forum/" onclick="window.open(this.href);return false;. Unter der Delphi OpenGL Community gibt es ein Tutorial zu GLScene http://wiki.delphigl.com/index.php/Tutorial" onclick="window.open(this.href);return false;, und auch viel Wissen, wie man ohne GLScene OpenGL hinbekommt.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: OpenGL Context erzeugen

Beitrag von mse »

Traude hat geschrieben:denn für OpenGL würde ich auch das Widgetset wechseln. Und wenn Not am Mann ist, kann ich auch nicht implementierte Sachen ergänzen, denn wenn es nur OpenGL betrifft, kenn ich mich ein wenig besser aus.
MSEgui hat topengl widget. Wenig getestet.

Martin

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: OpenGL Context erzeugen

Beitrag von Traude »

Dankeschön für die Antworten.
Scotty hat geschrieben:Willst Du visuell arbeiten oder alles selbst erzeugen?
Eigentlich will ich alles selbst erzeugen.

Was ich am liebsten hätte: Ein nettes OpenGL-Panel mitten in der LCL, so wie ich es von Delphi her gewöhnt bin, also ich meine ganz ohne glScene. Die Lazarus-OpenGL-Komponente sollte eigentlich genau das abdecken, aber um den RC unter meiner Kontrolle zu haben, muss ich den Sourcecode der Komponente verändern, weil man nämlich beim Erzeugen des RCs ein paar Parameter für OpenGL angibt. Aber die Kompo wrappt alles zu. Ich komme an meinen RC überhaupt nicht ran. Es ist ungefähr so, als würde man ein Fenster anfordern, aber man kann die Größe nicht angeben.

War wahrscheinlich eine dumme Idee von mir, das mit glScene. Ich dachte, glScene läuft doch in einem Lazarusfenster, und da müsste es doch eigentlich einen dazu passenden RC erzeugen können und dann ließe sich was draus machen.


mse hat geschrieben:MSEgui hat topengl widget. Wenig getestet.
Hallo Martin,
ja ich weiß. Ich habe sie gesehen, aber nicht verwendet. Und ich muss Dir ein großes fettes Lob aussprechen: echt vorbildlich hast Du das gemacht. Genauso hätte ich mir das vorgestellt. Ich hatte übrigens mseide bei mir installiert, hatte aber Probleme mit dem Editor. Und dann war ich wohl zu ungeduldig, zugegeben.

Hab übrigens viel von Dir und Graeme Geldenhuys gelernt. Sonst gibts ja kaum Pascal X11 code im Netz (das war eine steile Lernkurve!). Ich brauch das Zeug genau dafür: um einen plattform-unabhängigen RC zu erzeugen. Du weißt schon, Fenster, Timer, Events, und so weiter. Ich könnte mir das alles sparen, wenn ich SDL verwende. Aber ich mag keine Libraries zwischen OpenGL und mir.

Viele Grüße,
Traude

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OpenGL Context erzeugen

Beitrag von pluto »

Du könntest dir auch noch mal anschauen wir der OpenGL Context von Andorra erzeugt wird.
Du kannst Andorra hier runter laden: http://andorra.sourceforge.net/index.php" onclick="window.open(this.href);return false;
MFG
Michael Springwald

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: OpenGL Context erzeugen

Beitrag von Traude »

Hallo, Pluto
Ja das kenne ich auch schon. Andorra2D verwendet das glfw (OpenGL Framework). Das glfw hat einen Pascal Header, der aber glaub ich veraltet ist. Er hat ganz sicher diesen Header auf den neuesten Stand gebracht. Das ist natürlich eine clevere Methode. Ich habe das nach Pascal übersetzt, also nur teilweise, nur den Teil, den ich davon gebraucht habe, weil ich meinen Untergrund besser kennen lernen wollte.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL Context erzeugen

Beitrag von Scotty »

War wahrscheinlich eine dumme Idee von mir, das mit glScene
Falls Du Hilfe brauchst, einen OpenGL-Kontext auf irgendeinem Control per GLScene dynamisch zu erzeugen, dann sag Bescheid.

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: OpenGL Context erzeugen

Beitrag von Traude »

War doch nicht so eine dumme Idee mit glScene. :wink: Ich habe bisher den Fehler gemacht, immer in die Source-Forge Variante von glScene zu gucken, man muss aber die Version nehmen, die FreePascal selber hostet, die ist auch auf der Lazarus-Wiki-glScene-Seite angegeben: http://wiki.lazarus.freepascal.org/GLScene/de, man muss das SVN auschecken (siehe ziemlich weit unten auf der Wiki-Seite).

Unter "/Source/platform" habe ich dort ein paar Dinge gefunden, mit denen ich mir vorstellen könnte, einen RC mit GTK aufzusetzen. Das gibt zwar Arbeit und ich kann nicht garantieren, ob ich es schaffe. Sollte ich es schaffen, werde ich Euch den Code samt Beispiel zur Verfügung stellen.

@Scotty: Ich möchte nicht unhöflich sein, aber ich will glScene nicht verwenden. Warum ist ganz einfach erklärt: wenn Du mir folgende Fragen alle mit "JA" beantworten kannst, würde ich glScene in Erwägung ziehen:
  • Kann man mit glScene einen OpenGL 3.0/3.1 Context erzeugen? (ich bin ganz sicher dass man das nicht kann, denn die glx-Version von Pascal 2.2 ist veraltet und ich musste sie für meine eigenen Zwecke neu übersetzen)
  • Kann man mit glScene kontrollieren, ob man alte Displaylisten oder moderne VBOs einsetzt? (das ist nur eine Beispiel, es gibt noch viele andere Dinge dieser Art)
  • Gibt es einen Collada Loader in glScene? (ich habe mich tagelang ins Web gehängt, habe aber keinen einzigen Collada Loader für Pascal gefunden, es würde mich also ziemlich wundern, wenn Du einen auftreiben kannst)
Nichts für ungut und viele Grüße
Traude


EDIT:
Ich will Euch nicht vorenthalten, was ich heute morgen gefunden habe:
http://www.mail-archive.com/lazarus@laz ... 00778.html

Das bedeutet im Klartext: Es könnte sein, dass sich GTK und OpenGL eine Art "Kampf" liefern. Das bewirkt z.B. ein Flimmern des Bildschirms. :(

Ich möchte das jetzt nicht kommentieren, da ich zu wenig Info drüber habe. Aber wenn das stimmt, ist es ein Killerargument für OpenGL-Anwendungen mit GTK.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL Context erzeugen

Beitrag von Scotty »

Deine Fragen solltest Du besser im GLScene-Forum stellen. Ich benutze jedenfalls GLScene und bin äußerst zufrieden.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: OpenGL Context erzeugen

Beitrag von Euklid »

Traude hat geschrieben:Das bedeutet im Klartext: Es könnte sein, dass sich GTK und OpenGL eine Art "Kampf" liefern. Das bewirkt z.B. ein Flimmern des Bildschirms. :(
... und wie löst dann GLScene das Problem?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OpenGL Context erzeugen

Beitrag von pluto »

... und wie löst dann GLScene das Problem?
Ich würde sagen mit einem Grafik Buffer. Das gleiche Problem gibt es im Canvas, wenn da eine Line z.b. gezeichnet werden soll mit der Maus. Oder wenn Objekte über den Canvas gezogen werden sollen Z.B . ein Viereck und soweiter.

Also: Versuchen, alles in einen Hintergrund Buffer zu zeichnen und erst dann alles auf den Ausgabe Context kopieren. Frag mich aber jetzt nicht wie das mit OpenGL geht. Ich kenne nur Canvas.
MFG
Michael Springwald

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: OpenGL Context erzeugen

Beitrag von Traude »

... und wie löst dann GLScene das Problem?
Das versuch ich ja grade, herauszufinden. glScene und GTK sind beide ganz schön umfangreiche Bibliotheken. Da brauch ich eine Weile. Das einzige, was ich derzeit mich Sicherheit sagen kann, dass GlScene es anders macht als die Lazarus-OpenGL-Komponente, es gibt also mehr als eine Möglichkeit (oder vielleicht eine ältere und eine neuere?)

Die glScene-Variante macht es ganz ähnlich wie ich, wenn ein OpenGL-Window vom X11 Server anfordere, insofern habe ich die Hoffnung, dass ich da eher durchsteige. Viel Info habe ich nicht - praktisch gar keine.


EDIT: hier habe ich einen Link in die Lazarus Mailing List wo man sehen kann, dass Bildschirmflackern noch vor ganz kurzer Zeit offenbar ein Problem war: http://www.mail-archive.com/lazarus@laz ... 05093.html

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: OpenGL Context erzeugen

Beitrag von Traude »

Um die Frage zu beantworten, wie glScene das macht:

glScene benutzt sowohl highlevel GTK Funktionen als auch lowlevel X11 Server Funktionen, als auch noch andere z.B.:

(Das ist zu finden im glScene-Unterverzeichnis Source/Platform/GLLinGTKContext.pas,
procedure TGLGTKContext.DoCreateContext(outputDevice : HDC); )

Zum Vorbereiten der Erzeugung des Context (nur beispielsweise):

Code: Alles auswählen

gtk_widget_realize(FGTKWidget); // eine highlevel GTK Funktion
gtk_widget_set_double_buffered(FGTKWidget, False); // eine highlevel GTK Funktion
XGetWindowAttributes(CurXDisplay, CurXWindow, @winattr); // eine lowlevel Funktion des X11Server
Zur Erzeugung des Context:

Code: Alles auswählen

FRenderingContext := glXCreateContext(CurXDisplay, vi, nil, true); // eine lowllevel glx Funktion
Bei Erzeugung des Context steht übrigens folgender aufschlussreicher Kommentar:
//Last Param (Direct Draw) MUST (be) true, otherwise I get GdK-Error on machines with HW-Accel. Not at this line, but somwhere latere (didn't find where) :wink:

Das ist also ein bunter Mischmasch. Wenn man hier nicht ganz genau weiß, was man tut, kann nur Unsinn rauskommen. Jedenfalls muss man dazu GTK kennen, und das möchte ich eigentlich vermeiden, mich da zu tief reinzuarbeiten. Sieht so aus als müsste ich auf GTK verzichten.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: OpenGL Context erzeugen

Beitrag von Euklid »

Rein interessehalber: Tritt das Problem mit auch mit gtk2 auf?

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: OpenGL Context erzeugen

Beitrag von Traude »

Das Problem ist, dass sich zwei Programmteile, die prinzipiell das Gleiche machen, darüber einig werden müssen, wer was wie und wann tun darf. Man kann dem Problem nicht entkommen, indem man die neuere Version von GTK benutzt.:wink:

Das Problem besteht daher in gleicher Weise sowohl für alle Widgetsets (wurscht welche Version es ist) als auch für die Windows "GUI". Windows behandelt das irgendwie, frag mich nicht wie, man kann ja nicht hineinsehen.

Und dass das ein Problem ist, sieht man daran, dass sowohl GTK als auch QT zusätzliche Features haben, um OpenGL einzubinden. Für GTK2 gibt es zumindest zwei verschiedene Bibliotheken. Damit sollte man das Problem in den Griff kriegen.

Antworten