在Mac OS X中的进程之间共享OpenGL帧缓冲区

时间:2014-02-24 21:01:03

标签: macos opengl

Mac OS X中是否有办法在进程之间共享OpenGL帧缓冲?也就是说,我想在一个进程中渲染到屏幕外目标并将其显示在另一个进程中。

你可以在Windows中通过DirectX(实际上是DXGI)在共享模式下创建一个表面(相当于OpenGL帧缓冲的DXGI),为该表面获取一个不透明的句柄,通过你喜欢的任何方式将它传递给另一个进程,然后在另一个进程中创建一个表面,但传入现有的句柄。您可以在一个过程中将曲面用作渲染目标,然后将其用作另一个中的纹理以根据需要使用。实际上整个合成Window系统从Vista开始就是这样的。

如果这是不可能的,我当然可以将帧缓冲区的内容放入系统内存并使用跨进程共享内存将其送到目标进程,然后再从那里上传,但这会不必要地慢。

2 个答案:

答案 0 :(得分:1)

根据您真正想要做的事情,此示例代码项目可能是您想要的: MultiGPUIOSurface sample code

答案 1 :(得分:0)

这实际上取决于你如何使用它的背景。

  

可以在上下文之间共享的对象包括缓冲对象,   程序和着色器对象,渲染缓冲对象,采样器对象,   同步对象和纹理对象(纹理对象除外)   名为零)。

     

其中一些对象可能包含视图(替代解释)   部分或全部另一个对象的数据存储。例子是纹理   缓冲区对象,包含缓冲区对象的数据存储视图,   和纹理视图,包含另一个纹理对象的视图   数据存储。视图充当数据存储所在对象的引用   被观看。

     

包含对其他对象的引用的对象包括framebuffer,   程序管道,查询,变换反馈和顶点数组对象。   这些对象称为容器对象,不共享。

Chapter 5 / OpenGL-4.4 core specification

你可以在Windows而不是OS X上做这些事情的原因是图形显然使用了一个API,允许在这些进程之间共享DirectX上下文。如果OS X在OpenGL API中没有该功能,那么您将不得不提出自己的解决方案。看一下OpenGL Programming Guide for Mac,有一个小部分描述了使用多个OpenGL上下文。

enter image description here