【问题标题】:OpenGL - Share existing textures with future contexts?OpenGL - 与未来的上下文共享现有纹理?
【发布时间】:2012-11-14 21:37:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 不确定是否适用于 windows,但在 linux 上,您可以使用共享的 OpenGL 上下文创建窗口。也许可以为 windows 做类似的事情
  • @BЈовић:但是当您创建一个与“主”上下文共享资源的新上下文时。在“主”上下文中已经创建的资源(在新上下文之前)是否也共享?
  • @ronag:是的,它们是共享的。事实上,在新上下文中创建任何新纹理或其他名称对象之前,必须创建共享,因为在共享之前创建名称可能会导致命名空间冲突。但是,如果您只想渲染到多个窗口:完全可以在任意数量的窗口上使用单个 OpenGL 上下文,只要它们的 PIXELFORMATDESCRIPTOR 兼容。这就是 wglMakeCurrent 的 HDC 参数的含义。如果上下文严格绑定到单个窗口,wglMakeCurrent 只有一个 HRC 参数。
  • @datenwolf:在我看来,你在自相矛盾。我认为您的意思是它们不共享?或者您的意思是共享之前在“主”上下文中创建的对象是可以的,但对于共享之前在“新”上下文中创建的对象来说不是?
  • @datenwolf:如果您将所有这些有用的信息都放入答案中,那么我可以接受。

标签: c++ c windows opengl


【解决方案1】:

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

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

【讨论】:

  • 再次感谢您提供如此详细的信息。我遇到了类似的问题,并重读了“句柄可以(通过 wglMakeCurrent 或 wglMakeContextCurrentARB)与任何与 共享相同像素格式的 HDC 一起使用,并在同一设备上创建,但受 API 施加的约束”的部分版本。”来自官方文档。你的回答让我走上了正确的道路:)
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多