habe ein paar für mich essentielle, grundlegende Fragen zu OpenGl, vielleicht kann mir hier jemand weiterhelfen...
1) kann man OpenGl verwenden, parallel zur Bildschirmausgabe nicht sichtbare Bilder zu erstellen / berechnen? Sprich, die Bilder sollen zwar gerendert, und das Endprodukt in einen Stream abgelegt, jedoch nicht am Bildschirm ausgegeben werden. (Habe da in einem anderen Thread was von FrameBufferObjects gelesen...)
2) Gibt es eine allgemeine Möglichkeit, informiert zu werden, wenn die anstehenden auszuführenden Grafikoperationen von den GPUs abgearbeitet wurden?
3) Gibt es die Möglichkeit, generierten Text oder Bitmaps ohne Antialias zu rendern, auch wenn das auf den ersten Blick unsinnig erscheint... ?
4) Kann ich eine Form / ein Fenster in 2D und 3D Zonen unterteilen?
Vielen Dank vorab,
Peter
_________________ Was mache ich, wenn ein Bär meine Frau angreift? Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2067
Programmiersprache: C++
bytecook hat geschrieben:
1) kann man OpenGl verwenden, parallel zur Bildschirmausgabe nicht sichtbare Bilder zu erstellen / berechnen? Sprich, die Bilder sollen zwar gerendert, und das Endprodukt in einen Stream abgelegt, jedoch nicht am Bildschirm ausgegeben werden. (Habe da in einem anderen Thread was von FrameBufferObjects gelesen...)
Das ist möglich. Ab OpenGL 3.0 gibt es dafür die FBOs in welche gerendert wird. Interessant können dann auch die PBOs sein um die Daten asynchron zu verarbeiten. In vorherigen Versionen ist es auch schon möglich, aber es macht keinen Sinn darauf zu gehen.
bytecook hat geschrieben:
2) Gibt es eine allgemeine Möglichkeit, informiert zu werden, wenn die anstehenden auszuführenden Grafikoperationen von den GPUs abgearbeitet wurden?
Mir ist keine API dafür bekannt.
bytecook hat geschrieben:
3) Gibt es die Möglichkeit, generierten Text oder Bitmaps ohne Antialias zu rendern, auch wenn das auf den ersten Blick unsinnig erscheint... ?
Ja, per Default hast du kein Antialias.
bytecook hat geschrieben:
4) Kann ich eine Form / ein Fenster in 2D und 3D Zonen unterteilen?
Kann ich dir spontan nicht beantworten. Sollte aber eigentlich gehen.
Programmierseitig starte ich heute einmal, mir die aktuelle Headerdatei genauer anzusehen und mal grundlegende Funktionen in eine Basiskomponente einzupflegen.
LG,
Peter
_________________ Was mache ich, wenn ein Bär meine Frau angreift? Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
1) kann man OpenGl verwenden, parallel zur Bildschirmausgabe nicht sichtbare Bilder zu erstellen / berechnen? Sprich, die Bilder sollen zwar gerendert, und das Endprodukt in einen Stream abgelegt, jedoch nicht am Bildschirm ausgegeben werden. (Habe da in einem anderen Thread was von FrameBufferObjects gelesen...)
Wie man eine Scene in eine Textur rendert, hätte ich ein Beispiel in Lazarus.
1) kann man OpenGl verwenden, parallel zur Bildschirmausgabe nicht sichtbare Bilder zu erstellen / berechnen? Sprich, die Bilder sollen zwar gerendert, und das Endprodukt in einen Stream abgelegt, jedoch nicht am Bildschirm ausgegeben werden. (Habe da in einem anderen Thread was von FrameBufferObjects gelesen...)
Wie man eine Scene in eine Textur rendert, hätte ich ein Beispiel in Lazarus.
Hallo Mathias,
das wäre sehr hilfreich, danke für das Angebot!
Grüße aus Dornbirn, Vorarlberg,
Peter
_________________ Was mache ich, wenn ein Bär meine Frau angreift? Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Bei der Abfrage, wann Zeug fertig wird, habe ich eine gegenfrage: Warum willst du das wissen?
Die GPU ist zwar frei, deine Befehle umzusortieren und beliebig parallel im Hintergrund auszuführen, aber der beobachtbare Effekt bleibt immer gleich. Das heißt, wenn du z.B. in ein FBO renderst, und dann den Inhalt dieses FBO ausliest, wirst du immer das sehen, was reingerendert wurde. Das Auslesen (oder irgendein zwischenschritt da hin) wird dann darauf warten, dass das Rendern in das FBO fertig ist.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Bei der Abfrage, wann Zeug fertig wird, habe ich eine gegenfrage: Warum willst du das wissen?
Die GPU ist zwar frei, deine Befehle umzusortieren und beliebig parallel im Hintergrund auszuführen, aber der beobachtbare Effekt bleibt immer gleich. Das heißt, wenn du z.B. in ein FBO renderst, und dann den Inhalt dieses FBO ausliest, wirst du immer das sehen, was reingerendert wurde. Das Auslesen (oder irgendein zwischenschritt da hin) wird dann darauf warten, dass das Rendern in das FBO fertig ist.
viele Grüße, Horazont
Hallo Horazont,
das ist natürlich gut so.
Warum ich das wissen muss:
Ich missbrauche die Gpu, um Bilder für Endgeräte zu rendern. Der Bildaufbau wird mittels Editoranweisung vorgegeben. diser ist rein virtuell und objektorientiert aufgebaut, Coords sind vom Typ Single, das Ausgabesystem muss damit umgehen können. Da bietet sich OGL geradezu an. Mit dem Editor werden u.A. Barcodes, Schriftarten, verschiedene Sicherheitsmerkmale, etc erzeugt und diese dann über einen Zwischenschritt auf einem Zielsystem ausgegeben. Dieser Zwischenschritt bedarf, dass alle Renderoperation abgeschlossen sind.
Die fertigen Bilddaten müssen dann für die entsprechenden Endgeräte entweder auf Bitebene oder 4 Bit Graustufenebene (Farbseparation / Shader) aufbereitet werden. Dazu ist die Grafikkarte naturgemäß idealer als eine Cpu. Unter DirectX hatte ich in Verbindung mit FMX allerdings das Problem, dass die Bildoperationen entweder nicht (= schwarzes Bitmap) oder vollständig zurückkamen. Sprich, ich hatte vor ca. 1 1/2 Jahren in FMX keine saubere Möglichkeit, zu wissen, wann die GPUs mit den Aufgaben fertig waren. Zudem gab es immer wieder MS-D2d10.dll Fehler... Direct2D ist scheinbar nicht wirklich threadsafe umgesetzt, so wie es aussieht...
Cuda von NVidia wäre eine Möglichkeit, unsere Anforderungen so wie gewünscht umzusetzen (Gespräch mit einem Mitarbeiter von http://home.otoy.com/), jedoch limitiert uns dies zu stark auf NV und bindet uns an den PC, was wir als unerwünscht empfinden... Ausserdem läuft in der nächsten Release unserer Hardware OGL Es unter Linux, willkommen für uns, unseren Druckysstemen gleich eine entsprechende Gui in OGL zu verpassen.
LG,
Peter
Mein Editor, FMX Edition, XE6, alle Elemente sind eigenentwickelt und kommen ohne FMX Designer bzw Emb Komponenten aus. Bild entfernt wegen größe, klick hier
_________________ Was mache ich, wenn ein Bär meine Frau angreift? Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
Zuletzt geändert von bytecook am So Jun 21, 2015 19:04, insgesamt 1-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wie gesagt, es würde mich arg wundern, wenn du das gleiche Problem bei OpenGL hättest. Wenn du aus einer Textur liest, die zu einem FBO gehört, solltest du immer das Ergebnis bekommen, als ob du auf das Ergebnis gewartet hättest.
Thread-Safety ist auch bei OpenGL so eine Sache, da weiß ich gerade nicht genau, wie die Einschränkungen sind, iirc hat sich das mit OpenGL 3 geändert.
Wenn du schon über CUDA nachdenkst, kannst du dir mal OpenCL anschauen. Das ist plattformunabhängig und auch eine Library um auf GPUs zu rechnen. Wobei mir dein Use-Case eher so aussieht, als ob du mehr Zeichnen als Rechnen wolltest.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Thread-Safety ist abhängig vom jeweiligen OS. Unter Windows ist es ganz eindeutig: Don't
Dein OpenGL-Context wird sozusagen an den DC gebunden und unterliegt damit den gleichen Einschränkungen.
Es gibt zwar einige Ausnahmen/ Workarounds (hauptsächlich Objekt-Funktionen) bei denen du die CPU-Arbeit auf einen anderen Thread auslagern darfst, aber das braucht wieder zusätzlichen Overhead und dürfte dir bei deinen Problem wenig nutzen.
Die GPU-Arbeit selbst ist immer Singlethreaded und muss immer vom gleichen Thread kommen der auch den DC erstellt hat. Daher darf es auch nur einen aktiven Context pro DC geben.
Wie gesagt, es würde mich arg wundern, wenn du das gleiche Problem bei OpenGL hättest. Wenn du aus einer Textur liest, die zu einem FBO gehört, solltest du immer das Ergebnis bekommen, als ob du auf das Ergebnis gewartet hättest.
Thread-Safety ist auch bei OpenGL so eine Sache, da weiß ich gerade nicht genau, wie die Einschränkungen sind, iirc hat sich das mit OpenGL 3 geändert.
Wenn du schon über CUDA nachdenkst, kannst du dir mal OpenCL anschauen. Das ist plattformunabhängig und auch eine Library um auf GPUs zu rechnen. Wobei mir dein Use-Case eher so aussieht, als ob du mehr Zeichnen als Rechnen wolltest.
viele Grüße, Horazont
Hmm, danke für die Info. Eine NVidia Bindung scheidet allerdings wegen den folgenden Projekten definitiv aus. Rechnen ist auch ein Thema, wenn derzeit auch untergeordnet.
LG
Peter
_________________ Was mache ich, wenn ein Bär meine Frau angreift? Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
Thread-Safety ist abhängig vom jeweiligen OS. Unter Windows ist es ganz eindeutig: Don't
Dein OpenGL-Context wird sozusagen an den DC gebunden und unterliegt damit den gleichen Einschränkungen.
Es gibt zwar einige Ausnahmen/ Workarounds (hauptsächlich Objekt-Funktionen) bei denen du die CPU-Arbeit auf einen anderen Thread auslagern darfst, aber das braucht wieder zusätzlichen Overhead und dürfte dir bei deinen Problem wenig nutzen.
Die GPU-Arbeit selbst ist immer Singlethreaded und muss immer vom gleichen Thread kommen der auch den DC erstellt hat. Daher darf es auch nur einen aktiven Context pro DC geben.
Danke für die Info. In meinem Falle benötige ich also zwei oder mehrere DCs, einen für die visuelle Darstellung, einen oder mehrere für die Hintergrundberechnung. Gibt es hierfür bezüglich der DCs eine OGL Einschränkung?
LG,
Peter
_________________ Was mache ich, wenn ein Bär meine Frau angreift? Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
bytecook hat geschrieben:
Danke für die Info. In meinem Falle benötige ich also zwei oder mehrere DCs, einen für die visuelle Darstellung, einen oder mehrere für die Hintergrundberechnung. Gibt es hierfür bezüglich der DCs eine OGL Einschränkung?
LG,
Peter
Ja das ist ein wenig Tricky. Du musst bedenken das der OpenGL Context nicht wirklich an den DC gebunden ist. Stattdessen wird der OpenGL Context fuer eine bestimmte DC-Klasse erzeugt und du sagst deinen Thread welchen OpenGL Context und welchen DC er nutzen soll (MakeCurrent). Wenn du also mit mehreren DC arbeiten willst hast du zwei Möglichkeiten:
1.) Du benutzt MakeCurrent um deinen OpenGL Context an einen anderen DC anzuheften. Dabei muss aber die DC-Klasse die gleiche sein und du musst deinen Context ggf. vorher ausschalten (MakeCurrent(NULL,NULL)). Das ist zum Beispiel fuer Setups mit mehreren Monitoren ein gängiger Weg, aber ich weiss nicht wie weit SwapBuffer da wieder Mist baut.
2.) Du benutzt pro DC einen eigenen Thread und verteilst Objekte mit wglShareLists. Damit kannst du GPU-Seitige Objekte fuer Beide gleichzeitig benutzen. Aber Achtung, einige der modernen Sachen wie FBOs oder VAOs sind nicht rein GPU-Steitig und koennen daher nicht geshared werden. Das ist allerdings nicht gerade gut Dokumentiert und war eigentlich nur bei MFC... nun ja nicht unbedingt ueblich aber wenigstens so halbwegs sinnvoll... Insgesamt duerfte es aber leichter sein, als die erste Variante da du weniger Stress mit Synchronisierung hast.
[edit] In beiden Faellen ist aber unklar in wie weit du davon profitierst. Die CPU-Seitigen Sachen duerften schneller werden aber auf der GPU sieht das schon wieder anders aus. Letztenendes packt Windows alles in eine CommandQueue, fuer alle GPUs. Und wie diese dann abgearbeitet wird.... frag den Fuchs
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
bytecook hat geschrieben:
Lord Horazont hat geschrieben:
[…]Wenn du schon über CUDA nachdenkst, kannst du dir mal OpenCL anschauen. Das ist plattformunabhängig und auch eine Library um auf GPUs zu rechnen. Wobei mir dein Use-Case eher so aussieht, als ob du mehr Zeichnen als Rechnen wolltest.[…]
Hmm, danke für die Info. Eine NVidia Bindung scheidet allerdings wegen den folgenden Projekten definitiv aus. Rechnen ist auch ein Thema, wenn derzeit auch untergeordnet.
Nun, OpenCL ist eben nicht an nvidia gebunden.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: Google [Bot] und 20 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.