Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:是否支持在一个上下文中渲染成FBO,然后使用FBO';另一个是什么纹理?_C++_Qt_Opengl - Fatal编程技术网

C++ OpenGL:是否支持在一个上下文中渲染成FBO,然后使用FBO';另一个是什么纹理?

C++ OpenGL:是否支持在一个上下文中渲染成FBO,然后使用FBO';另一个是什么纹理?,c++,qt,opengl,C++,Qt,Opengl,我使用以下OpenGL设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中 我使用此帧缓冲区中的目标纹理绘制一个带纹理的四边形,它在视口中显示立方体 当流程的两个阶段都在同一上下文中完成时,这种方法可以正常工作,但如果阶段1在与阶段2不同的上下文中完成(请注意,这些上下文都是共享的,并且都在同一线程上),则会中断。在这种情况下,我只在调整视口大小(重新创建帧缓冲区)时才看到显示的立方体。立方体有时会损坏或支离破碎,这让我相信,我看到的只是纹理在调整大小之前使用的部分内存,并且没有任何东西能够正确

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

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

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

    我尝试了以下不成功的组合(主上下文是我使用纹理绘制四边形的地方,次上下文是将立方体“屏幕外”渲染到帧缓冲区的地方):

    • 在次上下文中创建帧缓冲区、渲染缓冲区和纹理
    • 在次上下文中创建帧缓冲区和渲染缓冲区,在主上下文中创建纹理,然后将纹理附加到次上下文中的帧缓冲区
    • 在次上下文中创建帧缓冲区、其渲染缓冲区和两个单独的纹理。其中一个纹理最初附加到帧缓冲区进行渲染。对帧缓冲区的渲染完成后,将分离第一个纹理,并附着第二个纹理。包含渲染内容的先前附加纹理与主上下文中的四边形一起使用
    此外,我不能使用
    glBlitFramebuffer()
    ,因为我无法访问
    QOpenGLWidget
    在应用程序中使用的帧缓冲区(据我所知,
    QOpenGLWidget::defaultFramebufferObject()
    返回0,这会导致
    glBlitFramebuffer
    给我错误)

    我成功地使渲染工作正常的唯一方法是使用
    QOpenGLFrameBuffer
    ,并在我想将纹理与四边形一起使用时调用
    takeTexture()
    。然而,这样做意味着
    QOpenGLFrameBuffer
    会为自己创建一个新的纹理,一旦我使用了它,我就必须销毁旧的纹理,这看起来效率很低


    我能做些什么来解决这个问题吗?

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

    “在我的实际应用程序中,我使用的是Qt OpenGL小部件,它们被迫使用各自的上下文。”有什么办法可以避免这样做吗?就我目前所知,没有。我想以前QGLWidget支持它,但新的Qt5 OpenGL API不支持它。@rabbi76,已修复。我尝试过,不幸的是,它似乎没有什么不同。今天早上,我确实能够做到这一点!我只需要在FBO发布后的FBO上下文中的正确位置调用它。非常感谢你的提示!