在Mac OS X中共享OpenGL帧缓冲区的方法

3
在Mac OS X中,有没有一种方法可以在进程之间共享OpenGL帧缓冲区?也就是说,我想在一个进程中渲染到屏幕外的目标,并在另一个进程中显示它。
在Windows中,您可以使用DirectX(实际上是DXGI)创建一个表面(相当于OpenGL帧缓冲区),并以共享模式获取该表面的不透明句柄,通过任何您喜欢的方式将其传递给另一个进程,然后在该进程中创建一个表面,但传递现有的句柄。您在一个进程中使用表面作为渲染目标,然后在另一个进程中将其用作纹理以按需使用。实际上,从Vista开始整个合成窗口系统都是这样工作的。
如果这不可能,我当然可以将帧缓冲区的内容放入系统内存中,并使用跨进程共享内存将其传递到目标进程,然后再从那里上传它,但这将是不必要的缓慢。
2个回答

3

看起来正是我需要的。我之前不知道 IOSurface API,但它似乎就是为了在进程间共享 GPU 内存中的图像而设计的。顺便说一下,因为花费了超过一分钟才找到,这里是 API 文档链接:https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/IOSurfaceAPI_header_reference/Reference/reference.html#//apple_ref/doc/uid/TP40011198 - U62

0

这真的取决于你使用它的上下文。

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

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

包含对其他对象引用的对象包括帧缓冲对象、程序管线对象、查询对象、变换反馈对象和顶点数组对象。这些对象称为容器对象,不会被共享。

第5章/OpenGL-4.4核心规范

你可以在Windows上做这些事情而在OS X上却不能,原因是图形显然利用了一个API,允许DirectX上下文在这些进程之间共享。如果OS X没有OpenGL API内的这种能力,那么你就必须想出自己的解决方案。看一下Mac OpenGL编程指南,其中有一个小节描述了如何使用多个OpenGL上下文。

enter image description here


是的,我看到了关于在同一进程中不同线程之间共享对象的文档。我只是希望有一些文档不太完善的方法可以跨进程实现这个功能。据我所知,OS X的窗口合成系统与Windows的工作方式相同,因此有一些微弱的希望它可能会在OpenGL下面的某个级别上公开至少一种在GPU设备内存之间进行内存复制的方法,而无需将图像带回系统内存。 - U62

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接