C++ 在两个应用程序之间共享OpenGL帧缓冲区/渲染缓冲区

C++ 在两个应用程序之间共享OpenGL帧缓冲区/渲染缓冲区,c++,windows,qt,opengl,C++,Windows,Qt,Opengl,假设我有一个应用程序A,它负责通过OpenGL库在屏幕上绘制东西。出于紧密集成的目的,我想让这个应用程序A完成它的工作,但在FBO中渲染或直接在渲染缓冲区中渲染,并允许应用程序B对该缓冲区进行只读访问,以处理屏幕上的显示(基本上将其渲染为2D纹理) FBO似乎属于OpenGL上下文,并且上下文不能在进程之间共享。我完全理解允许多个进程在同一上下文中出现两个混乱是邪恶的。但在我的特殊情况下,我认为它可能相当安全是合理的 注: 应用程序A是QApplication,而应用程序B是本机win32应用程

假设我有一个应用程序
A
,它负责通过
OpenGL
库在屏幕上绘制东西。出于紧密集成的目的,我想让这个应用程序
A
完成它的工作,但在FBO中渲染或直接在渲染缓冲区中渲染,并允许应用程序
B
对该缓冲区进行只读访问,以处理屏幕上的显示(基本上将其渲染为2D纹理)

FBO似乎属于OpenGL上下文,并且上下文不能在进程之间共享。我完全理解允许多个进程在同一上下文中出现两个混乱是邪恶的。但在我的特殊情况下,我认为它可能相当安全是合理的

注:

应用程序
A
QApplication
,而应用程序
B
本机win32
应用程序

编辑:


渲染大小接近全屏,我正在考虑使用
2048x2048 32位
缓冲区(我现在不使用alpha通道,但为什么不使用后者)

帧缓冲区对象不能在OpenGL上下文之间共享,无论它们是否属于同一进程。但是纹理可以共享,并且纹理可以用作帧缓冲区对象的颜色缓冲区附件

如果图形系统为该作业提供API,那么在进程之间共享OpenGL上下文实际上是可能的。对于X11/GLX,可以在多个进程之间共享间接渲染上下文。在Windows中,可能需要使用一些非常非常粗糙的黑客。MacOS X,不知道怎么做


因此,最简单的方法可能是使用像素缓冲区对象获得对渲染图片的性能访问。然后通过共享内存将其发送到另一个应用程序,并将其上载到纹理中(再次通过像素缓冲区对象)。

据我所知,在Windows下,您将无法在进程之间共享对象,除非它是内核模式的对象。即使共享的纹理和上下文也可以创建性能点击,这也让您承担了同步SwapBuffer()调用的额外责任。尤其是在windows平台下,OpenGL的实现更是臭名昭著


在我看来,可以使用进程间通信机制(如事件、互斥、窗口消息和管道)来同步渲染。但是请注意,以这种方式进行操作时需要考虑性能。内核模式的对象很好,但是每次转换到内核需要花费100毫秒。这对于高性能渲染应用程序来说是非常昂贵的。在我看来,您必须重新考虑多进程渲染设计。

是否需要实时更新?您可以将渲染图像写入文件并在B中加载。除此之外,在OpenGL中共享FBO并不是那么简单。也许你可以在GPU级别共享缓冲区。@Jeroen实时是必需的。。。我试图限制问题的范围,不要过早地解决同步问题,但你是对的,这很重要:)我已经尝试过了,我面临性能问题(
A
可以提供接近全屏的纹理…)。这就是我要求内存卡内存共享的原因。好吧,你必须跨进程共享OpenGL上下文,如果你解除进程之间的一些保护,这实际上是可能的。然而,我可以问你如何上传你的纹理?glTexImage2D还是glTexSubImage2D?后者的速度要快几个数量级。真的吗?我实际上使用了
glTexImage2D
。。。我会深入研究的+1我在这些情况下使用了共享内存,它非常有效。在高速率下,同步可能需要一个互斥器。我不得不说,这会有所不同……:)应该是基本的东西为您,但感谢这个提示!对我来说这样做听起来很公平。。。有点失望的想法是必须从存储卡中取出。。。