【发布时间】:2012-11-14 21:37:33
【问题描述】:
我有一个应用程序,我使用 FBO 扩展将帧绘制到纹理。
这些框架随后会显示到应用程序运行时打开的不同窗口。这意味着可以在创建任何新窗口的 OpenGL 上下文并调用 wglShareLists 之前创建和池化纹理。
目前我必须通过glReadPixels、glMapBufferRange 和glTexSubImage 将纹理移动到不同的窗口上下文中,效率相当低。
关于如何改进这一点的任何想法?我是否应该在程序启动期间创建多个(在任何时候都达到最大窗口数 ~4 个)OpenGL 上下文和隐藏窗口?那会有什么开销?
或者更好的是,有没有办法在现有和未来 OpenGL 上下文之间共享纹理?
【问题讨论】:
-
不确定是否适用于 windows,但在 linux 上,您可以使用共享的 OpenGL 上下文创建窗口。也许可以为 windows 做类似的事情
-
@BЈовић:但是当您创建一个与“主”上下文共享资源的新上下文时。在“主”上下文中已经创建的资源(在新上下文之前)是否也共享?
-
@ronag:是的,它们是共享的。事实上,在新上下文中创建任何新纹理或其他名称对象之前,必须创建共享,因为在共享之前创建名称可能会导致命名空间冲突。但是,如果您只想渲染到多个窗口:完全可以在任意数量的窗口上使用单个 OpenGL 上下文,只要它们的 PIXELFORMATDESCRIPTOR 兼容。这就是 wglMakeCurrent 的 HDC 参数的含义。如果上下文严格绑定到单个窗口,wglMakeCurrent 只有一个 HRC 参数。
-
@datenwolf:在我看来,你在自相矛盾。我认为您的意思是它们不共享?或者您的意思是共享之前在“主”上下文中创建的对象是可以的,但对于共享之前在“新”上下文中创建的对象来说不是?
-
@datenwolf:如果您将所有这些有用的信息都放入答案中,那么我可以接受。