OpenGL:是否支持在一个上下文中渲染到FBO,然后在另一个上下文中使用FBO的纹理?

时间:2017-08-03 19:06:34

标签: c++ qt opengl

我有以下OpenGL设置来解决帧缓冲区问题:

  1. 我将立方体渲染到帧缓冲区中。
  2. 我使用此帧缓冲区中的目标纹理绘制纹理四边形,在我的视口中显示多维数据集。
  3. 当进程的两个阶段都在同一个上下文中完成时,这可以正常工作,但如果阶段1在阶段2的不同上下文中完成,则会中断(请注意,这些上下文都是共享的,并且都在同一个线程上)。在这种情况下,当我调整视口大小(重新创建帧缓冲区)时,我只看到显示的多维数据集。立方体有时会被破坏或碎片化,这使我相信所有我看到的都是纹理在调整大小之前使用的内存部分,并且没有任何东西能够正常显示。

    我必须进行此设置的原因是,在我的实际应用程序中,我使用Qt OpenGL小部件,这些小部件被迫使用他们自己的单独上下文,所以我必须在自己的专用上下文中渲染我的场景然后使用可共享的OpenGL资源将其复制到相关的视口。如果我不这样做,我会因在其他环境中绑定/使用VAO而导致错误。

    我尝试过以下不成功的组合(其中主要上下文是我使用纹理绘制四边形的位置,以及辅助上下文,其中" offscreen"将多维数据集渲染到框架中缓冲发生):

    • 在辅助上下文中创建帧缓冲区及其渲染缓冲区及其纹理。
    • 在辅助上下文中创建帧缓冲区和渲染缓冲区,在主上下文中创建纹理,然后将纹理附加到辅助上下文中的帧缓冲区。
    • 在辅助上下文中创建帧缓冲区,其渲染缓冲区和两个单独的纹理。其中一个纹理最初附加到帧缓冲区以进行渲染。一旦渲染到帧缓冲区完成,第一个纹理就会被分离,第二个纹理会被附加。包含渲染内容的先前附加纹理与主要上下文中的四边形一起使用。

    此外,我无法使用glBlitFramebuffer(),因为我无法访问QOpenGLWidget在应用程序中使用的帧缓冲区(就我而言)试过,QOpenGLWidget::defaultFramebufferObject()返回0,导致glBlitFramebuffer给我错误。

    我设法让渲染工作的唯一方法是使用QOpenGLFrameBuffer并在我想要使用四边形纹理时调用takeTexture()。然而,这样做意味着QOpenGLFrameBuffer创建了一个新的纹理,我必须在使用它之后销毁旧的纹理,这看起来非常低效。

    我能解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我有一个使用类似纹理的项目。在绘制之后和使用glFinish()中的纹理之前,您需要调用QOpenGLFramebufferObject::texture()。这是我们在一些操作系统上的问题。