繁体   English   中英

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

[英]Share OpenGL frame buffer / render buffer between two applications

假设我有一个应用程序A witch负责通过OpenGL库在屏幕上绘制内容。 为了实现紧密集成,我想让这个应用程序A完成它的工作,但是在FBO中或直接在渲染缓冲区中渲染,并允许应用程序B对此缓冲区具有只读访问权以处理屏幕上的显示(基本上渲染)它作为2D纹理)。

似乎FBO属于OpenGL上下文,上下文在进程之间是不可共享的。我当然明白允许多个进程两个混乱的相同上下文是邪恶的。 但在我的特殊情况下,我认为认为它可能非常安全是合理的

注意:

应用程序AQApplication ,应用程序Bnative win32

编辑:

渲染大小接近全屏,我想的是2048x2048 32bits缓冲区(我现在不使用alpha通道,但为什么不使用后者)。

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

如果图形系统为此作业提供API,则实际可以在进程之间共享OpenGL上下文。 在X11 / GLX的情况下,可以在多个进程之间共享间接呈现上下文。 在Windows中可能有可能实现一些真正粗暴的黑客攻击。 MacOS X,不知道怎么做。

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

根据我的理解,除非是内核模式对象,否则您将无法在Windows下的进程之间共享对象。 即使是共享纹理和上下文也可以创建性能命中,它还为您提供了同步SwapBuffer()调用的额外责任。 特别是在Windows平台下,OpenGL实现是臭名昭着的。

在我看来,您可以继续处理进程间通信机制,如事件,互斥,窗口消息,管道以同步渲染。 但只是意识到以这种方式接近的性能考虑因素。 内核模式对象很好但每次转换到内核的成本都是100毫秒。 对于高性能渲染应用来说,这是非常昂贵的。 在我看来,你必须重新考虑多进程渲染设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM