【问题标题】:Sharing an OpenGL framebuffer between processes in Mac OS X在 Mac OS X 中的进程之间共享 OpenGL 帧缓冲区
【发布时间】:2014-02-24 21:01:02
【问题描述】:

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

您可以在 Windows 中使用 DirectX(实际上是 DXGI)执行此操作,方法是在共享模式下创建表面(DXGI 等效于 OpenGL 帧缓冲区),获取该表面的不透明句柄,通过您喜欢的任何方式将其传递给另一个进程,然后在该其他过程中创建一个表面,但传入现有的句柄。您在一个进程中将表面用作渲染目标,然后在另一个进程中将其用作纹理以根据需要使用。事实上,从 Vista 开始,整个合成窗口系统都是这样工作的。

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

【问题讨论】:

    标签: macos opengl


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    这真的取决于你如何使用它。

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

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

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

    Chapter 5 / OpenGL-4.4 core specification

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

    【讨论】:

    • 是的,我看到了有关在同一进程中不同线程上的上下文之间共享对象的文档。我只是希望有一些记录不充分的方法可以跨流程做到这一点。 AFAIK,OS X 的窗口合成系统的工作方式与 Windows 相同,因此有一些微弱的希望,它可能在 OpenGL 之下的某个级别上,至少公开一种将 GPU 设备内存用于内存副本的方法,而无需将图像带回系统记忆。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多