17 Stimmen

Gemeinsame Nutzung von OpenGL-Rahmenpuffern/Renderpuffern durch zwei Anwendungen

Nehmen wir an, ich habe eine Anwendung A die für das Malen von Inhalten auf dem Bildschirm über OpenGL Bibliothek. Um eine enge Integration zu erreichen, möchte ich diese Anwendung A seine Aufgabe erfüllen, sondern in einem FBO oder direkt in einem Renderbuffer rendern und einer Anwendung erlauben B zu haben schreibgeschützt auf diesen Puffer zugreifen, um die Anzeige auf dem Bildschirm zu verarbeiten (im Grunde wird sie als 2D-Textur gerendert).

Es scheint, dass FBOs zu OpenGL-Kontexten gehören und Kontexte nicht zwischen Prozessen geteilt werden können. Ich verstehe definitiv, dass es böse ist, wenn mehrere Prozesse mit demselben Kontext herumspielen. Aber in meinem speziellen Fall, denke ich, ist es vernünftig Ich denke, dass es ziemlich sicher sein könnte.

EDITAR:

Die Rendergröße ist fast bildschirmfüllend, ich dachte an eine 2048x2048 32bits Puffer (ich verwende den Alphakanal im Moment nicht, aber warum nicht später).

9voto

datenwolf Punkte 154484

Framebuffer-Objekte können nicht zwischen OpenGL-Kontexten geteilt werden, unabhängig davon, ob sie zum selben Prozess gehören oder nicht. Aber Texturen können geteilt werden y Texturen können als Farbpuffer-Anhang zu einem Framebuffer-Objekt verwendet werden.

Die gemeinsame Nutzung von OpenGL-Kontexten zwischen Prozessen ist tatsächlich möglich, wenn das Grafiksystem die API für diese Aufgabe bereitstellt. Im Falle von X11/GLX ist es möglich, indirekte Rendering-Kontexte zwischen mehreren Prozessen zu teilen. Unter Windows ist es vielleicht möglich, indem man ein paar sehr, sehr grobe Hacks anwendet. MacOS X, keine Ahnung, wie das geht.

Am einfachsten ist es wahrscheinlich, ein Pixel Buffer Object zu verwenden, um performanten Zugriff auf das gerenderte Bild zu erhalten. Dann senden Sie es über den gemeinsamen Speicher an die andere Anwendung und laden es dort in eine Textur hoch (wiederum über ein Pixel Buffer Object).

4voto

KayWang Punkte 71

Unter MacOS können Sie mit IOSurface um den Framebuffer zwischen zwei Anwendungen zu teilen.

1voto

sarat Punkte 9884

Nach meinem Verständnis können Sie die Objekte unter Windows nicht zwischen den Prozessen austauschen, es sei denn, es handelt sich um ein Kernel-Mode-Objekt. Sogar die gemeinsam genutzten Texturen und Kontexte können zu Leistungseinbußen führen, außerdem haben Sie die zusätzliche Verantwortung, die SwapBuffer()-Aufrufe zu synchronisieren. Besonders unter Windows ist die OpenGL-Implementierung berüchtigt.

Meiner Meinung nach können Sie auf Interprozess-Kommunikationsmechanismen wie Events, Mutex, Fenstermeldungen und Pipes zurückgreifen, um das Rendering zu synchronisieren, aber Sie sollten sich darüber im Klaren sein, dass es bei dieser Herangehensweise Leistungseinbußen gibt. Objekte im Kernelmodus sind gut, aber der Übergang zum Kernel kostet jedes Mal 100 ms. Das ist für eine Hochleistungs-Rendering-Anwendung verdammt kostspielig. Meiner Meinung nach muss man das Design des Multiprozess-Renderings überdenken.

1voto

elmarco Punkte 29466

Unter Linux ist eine Lösung die Verwendung von DMABUF, wie in diesem Blog beschrieben: https://blaztinn.gitlab.io/post/dmabuf-texture-sharing/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X