OpenGL - 与未来的上下文共享现有的纹理?

时间:2012-11-27 09:42:21

标签: c++ c windows opengl

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

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

目前我必须执行glReadPixelsglMapBufferRangeglTexSubImage将纹理移动到不同的窗口上下文中,效率相当低。

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

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

1 个答案:

答案 0 :(得分:11)

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

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