我想要做的是从一个上下文中获取渲染结果,并在另一个不与前一个上下文共享的上下文中进行进一步渲染。
我能想到的唯一方法是使用像API这样的glReadPixels将渲染结果从GPU内存复制到系统内存,并在另一个上下文中使用复制的数据。
有更好的方法吗?我的意思是不将数据从GPU内存复制到系统内存,系统再次复制到GPU。
我在Linux下使用GLX。
答案 0 :(得分:3)
我不知道如何正确分享它们。我能找到的最接近GLX的是GLX_NV_copy_image扩展名。在介绍中,它说:
WGL和GLX版本允许在不同上下文中的图像之间进行复制,即使这些上下文位于不同的共享列表中,甚至在不同的物理设备上也是如此。
使用此扩展程序,您可以使用glXCopyImageSubDataNV()
函数从一个上下文复制到另一个上下文。虽然这不允许共享,但它可能仍然比自己复制数据快得多。
正如您已经从名称中所知,这是特定于供应商的扩展。我不知道它得到了多大的支持,但你当然不应指望它存在于所有系统中。
其他窗口系统绑定具有甚至在进程之间共享图像的机制。例如。使用与OpenGL ES一起使用的EGL,EGLImage可用于此目的。但是通过浏览GLX规范和扩展列表,我无法发现类似的内容。
答案 1 :(得分:2)
如果黑客正常,您可以使用CUDA或OpenCL。仅适用于支持CUDA或OpenCL的GPU。
答案 2 :(得分:2)
还有一些AMD扩展可能与此版本有关:WGL_AMD_gpu_association和GLX_AMD_gpu_association:
虽然此扩展的重点是将GL上下文分配给特定的GPU并在GPU之间有效地复制数据,但它对同一GPU上的两个上下文也很有用:
为了提供从一个上下文到另一个上下文数据的加速路径,添加了新的blit函数blitContextFramebufferAMD。
这些扩展以及使用它们的一些同步技术在this AMD whitepaper中有更详细的介绍。