2

我有一个应用程序,我使用 FBO 扩展将帧绘制到纹理。

这些框架随后会显示到应用程序运行时打开的不同窗口。wglShareLists这意味着可以在创建和调用任何新窗口的 OpenGL 上下文之前创建和池化纹理。

目前我必须做glReadPixelsglMapBufferRange并将glTexSubImage纹理移动到不同的窗口上下文中,这是相当低效的。

关于如何改进这一点的任何想法?我是否应该在程序启动期间创建多个(在任何时候都达到最大窗口数 ~4 个)OpenGL 上下文和隐藏窗口?那会有什么开销?

或者更好的是,有没有办法在现有和未来的OpenGL 上下文之间共享纹理?

4

1 回答 1

14

在 OpenGL 上下文之间共享列表也将共享封装缓冲区对象(纹理、顶点缓冲区对象、像素缓冲区对象)的所有数据,但不共享抽象集合对象(帧缓冲区对象、顶点数组对象)。在新上下文中创建任何新的命名对象之前,必须创建共享,因为在共享之前创建名称可能会导致命名空间冲突。已经创建的对象是共享的。但这当然需要预防措施,因为如果上下文 A 和 B 都具有 ID=1 的纹理会发生什么?然而,如果 A 有很多纹理而 B 没有,那么 A 的纹理名称可以转移到 B 上就好了。这就是警告。

但是,如果您只想渲染到多个窗口:完全可以在任意数量的窗口上使用单个 OpenGL 上下文,只要它们的 PIXELFORMATDESCRIPTOR 兼容。这就是 wglMakeCurrent 的 HDC 参数的含义。如果上下文严格绑定到单个窗口,则 wglMakeCurrent 只有一个 HRC 参数。

于 2012-11-27T10:45:15.617 回答