在 OS X 上的 OpenGL 上下文之间共享数据(不同的版本/配置文件)

Posted

技术标签:

【中文标题】在 OS X 上的 OpenGL 上下文之间共享数据(不同的版本/配置文件)【英文标题】:Sharing data between OpenGL contexts on OS X (different version / profile) 【发布时间】:2015-08-26 11:17:19 【问题描述】:

我需要在两个 OpenGL 上下文之间共享纹理数据,一个是核心配置文件(当前 10.10 OS X 上的 4.1 版),另一个是旧版(2.1 版)。旧版配置文件由第三方库创建。

Apple documentation 表示要在上下文之间共享资源,它们必须是相似的(例如,相同的配置文件)。

并非每个上下文都可以与其他所有上下文共享。两个上下文必须共享相同的 OpenGL 配置文件。

还有其他方法可以避免内存传输吗?

(目前可行的解决方案是先将纹理下载到 CPU,然后在第二个上下文中重新上传到 GPU,这还可以,但速度很慢......)

【问题讨论】:

您是否尝试与不同的个人资料共享 2 个上下文?先尝试一下。也许它会起作用。 OS X 没有兼容性配置文件,顺便说一下。你有一个核心配置文件(3.2+),然后是一个遗留上下文(2.1)。迂腐,我知道,但如果它具有兼容性配置文件,您将可以同时访问 3.0+ 功能和已弃用的东西。 Michael > 在上下文创建过程中出现 kCGLBadMatch 错误(使用 CGLCreateContext) Andon > 谢谢,我修好了 您也许可以使用 iosurface 机制在上下文之间共享图像。不确定它是否会起作用,但您可能至少想研究一下。 【参考方案1】:

在 OSX 上,您可以使用 IOSurface 在不同的上下文(无论 opengl 配置文件)之间共享纹理。这简单。您创建一个 IOSurface (IOSurfaceCreate),然后在两个上下文中基于此 IOSurface 创建纹理(使用 CGLTexImageIOSurface2D),我认为它们只是相同 VRAM 位置的包装器。这么简单:-)

【讨论】:

是的,这就是我所做的。不需要内存传输,这很好!【参考方案2】:

虽然您有时无法在上下文之间共享纹理,但您可以使用CopyImageSubDataNV 将纹理从一个上下文复制到另一个上下文中的另一个纹理。

我不知道这是否支持 Mac 上的 OpenGL,但是当我进行多 GPU 渲染时,我无法在上下文之间共享纹理,因为它们位于两个不同的 GPU 上,但我从一个上下文中复制了纹理到另一个,它比手动传输到 cpu 并将其复制到另一个纹理要快得多。

您可以找到更多信息Here。

【讨论】:

据我所知,这在 OS X 上不可用(检查我的设置)。标准版本 gl_arb_copy_image 是自 GL 4.3 以来的核心,但无论如何感谢【参考方案3】:

可以在上下文之间共享所有 OpenGL 资源(甚至是着色器或 FBO)。有关更多信息,我们应该将其视为 How to share textures between an NSOpenGLView and a full screen context in Mac OS? 的副本

【讨论】:

您是否检查过这在不同配置文件的上下文(具有兼容性的核心配置文件,例如在 opengl 2.1 和 4.1 之间共享)之间的工作? 我明白你的意思,抱歉发布了另一个问题的答案。在 2 个 NSOpengLView 之间分享东西的事情让我非常生气,以至于我只是想分享我为使其发挥作用所做的长期研究(我没有找到任何详尽的帖子,只有答案的片段)。最终将它发布在错误的地方。我的错。 无论如何,我没有机会创造上述情况(不同的配置文件)。老实说,我认为它可能适用于两个配置文件之间共有的简单事物,例如纹理和 openGL 资源类型。 没问题,我明白 :) 我会很好地对其进行测试,但我认为情况可能并非如此(参见问题中指向 Apple 文档的链接),无论如何感谢您分享您的发现。跨度>

以上是关于在 OS X 上的 OpenGL 上下文之间共享数据(不同的版本/配置文件)的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 上的 Qt 4.8.6 中更改 QGLWidgets 的 OpenGL 上下文版本

在 Windows 和 Mac OS X 之间共享 Dropbox 上的 Eclipse 目录

在 Mac OS X 上使用 CGL 设置 OpenGL 上下文

64 位系统上的 OS X Carbon 框架

使用 GLFW3 在 OpenGL 上下文之间共享纹理不起作用

在 Mac OS X 10.9 中使用 GLFW 创建 OpenGL 3.3 上下文