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

标签 c++ qt opengl

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

  1. 我将立方体渲染到帧缓冲区中。
  2. 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。

当流程的两个阶段都在同一上下文中完成时,这可以正常工作,但如果阶段 1 在与阶段 2 不同的上下文中完成,则会中断(请注意,这些上下文都是共享的,并且都在同一线程上)。在这种情况下,我只会在调整视口(viewport)大小时(重新创建帧缓冲区)时看到显示的立方体。立方体有时会损坏或碎片化,这让我相信我所看到的只是纹理在调整大小之前使用的部分内存,并且没有任何内容可以正确显示。

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

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

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

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

我设法使渲染正常工作的唯一方法是使用 QOpenGLFrameBuffer 并在我想将纹理与四边形一起使用时调用 takeTexture()。然而,这样做意味着 QOpenGLFrameBuffer 会为自己创建一个新纹理,而我必须在使用过后销毁旧纹理,这似乎非常低效。

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

最佳答案

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

关于c++ - OpenGL:是否支持在一个上下文中渲染到 FBO,然后在另一个上下文中使用 FBO 的纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45492611/

相关文章:

opengl - glRotatef 无法正常工作

c++ - 避免 pthread 中产生多个线程

c++ - 将 strncpy 放入一个没有空终止符空间的字符串中是否安全?

c++ - 在这种情况下,关键字 "typename"和 "template"都不需要吗?

c++ - Qt QCompleter 不能设置它的大小?

c++ - 如何使用 RegExp 验证字符串表达式?

java - JOGL调试: DebugGL usage

c++ - 使用 p/invoke 将字符串数组从 C# 编码到 C 代码

c++ - 我不明白 QAbstractItemModel 是如何工作的

c++ - SDL 窗口无响应