在 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 上下文