Freigeben von OpenGL-Rahmenpuffer / Render-Puffer zwischen zwei Anwendungen

8

Nehmen wir an, ich habe eine Anwendung A hexe ist verantwortlich für das Malen von Sachen auf dem Bildschirm über OpenGL library. Für einen engen Integrationszweck möchte ich, dass diese Anwendung A ihre Arbeit macht, aber in einem FBO oder direkt in einem Render-Puffer rendert und einer Anwendung B erlaubt, auf schreibgeschützt zuzugreifen Dieser Puffer soll die Anzeige auf dem Bildschirm handhaben (im Grunde als 2D-Textur rendern).

Es scheint, dass FBOs zu OpenGL-Kontexten gehören und Kontexte zwischen Prozessen nicht gemeinsam genutzt werden können. Ich verstehe auf jeden Fall, dass es zweifelhaft ist, mehrere Prozesse mit demselben Kontext zuzulassen. Aber in meinem speziellen Fall denke ich, es ist vernünftig zu denken, dass es ziemlich sicher sein könnte.

HINWEIS:

Die Anwendung A ist eine QApplication und die Anwendung B ist eine native win32 eins

BEARBEITEN:

Rendergröße ist fast Vollbild, ich dachte an einen 2048x2048 32bits Puffer (ich benutze den Alpha-Kanal für jetzt nicht, aber warum nicht letzteres).

    
vrince 17.06.2011, 14:07
quelle

2 Antworten

3

Framebuffer-Objekte können nicht zwischen OpenGL-Kontexten aufgeteilt werden, unabhängig davon, ob sie zu demselben Prozess gehören oder nicht. Texturen können jedoch geteilt werden. und Texturen können als Farbpufferanhang an Framebuffer-Objekte verwendet werden.

Freigeben von OpenGL-Kontexten zwischen Prozessen ist möglich, wenn das Grafiksystem die API für diesen Job bereitstellt. Im Fall von X11 / GLX ist es möglich, indirekte Rendering-Kontexte zwischen mehreren Prozessen zu teilen. Es kann in Windows möglich sein, ein paar wirklich, wirklich grobe Hacks zu emulieren. MacOS X, keine Ahnung, wie man das macht.

Was wahrscheinlich am einfachsten ist, ist die Verwendung eines Pixel Buffer Objects, um performanten Zugriff auf das gerenderte Bild zu erhalten. Dann sende es über den gemeinsamen Speicher an die andere Anwendung und lade es dort in eine Textur hoch (wiederum über das Pixel-Puffer-Objekt).

    
datenwolf 17.06.2011, 14:27
quelle
0

Nach meinem Verständnis können Sie die Objekte unter Windows nicht für den Prozess freigeben, es sei denn, es handelt sich um ein Kernel-Modus-Objekt. Selbst die gemeinsam genutzten Texturen und Kontexte können Performance-Treffer erzeugen. Außerdem haben Sie die zusätzliche Verantwortung, die SwapBuffer () -Aufrufe zu synchronisieren. Vor allem unter Windows-Plattformen ist die OpenGL-Implementierung berüchtigt.

Meiner Meinung nach können Sie auf prozessübergreifende Kommunikationsmechanismen wie Events, Mutex, Fenstermeldungen und Pipes umschalten, um das Rendering zu synchronisieren. aber merke nur, dass es eine Leistungsüberlegung gibt, auf diese Weise zu kommen. Kernel-Modus-Objekte sind gut, aber der Übergang zum Kernel kostet jeweils 100ms. Das ist verdammt teuer für eine Hochleistungs-Rendering-Anwendung. Meiner Meinung nach müssen Sie das Multi-Prozess-Rendering-Design überdenken.

    
sarat 17.06.2011 15:01
quelle

Tags und Links