繁体   English   中英

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

[英]OpenGL: Is it supported to render into an FBO in one context, then use the FBO's texture in another?

我具有以下OpenGL设置,用于解决帧缓冲区问题:

  1. 我将多维数据集渲染到帧缓冲区中。
  2. 我使用该帧缓冲区中的目标纹理绘制一个纹理四边形,该四边形在我的视口中显示该多维数据集。

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

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

我尝试了以下不成功的组合(主要上下文是我使用纹理绘制四边形的位置,而次要上下文是将多维数据集“脱离屏幕”渲染到帧缓冲区中的位置):

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

另外,由于无法访问QOpenGLWidget在应用程序中使用的帧缓冲区,因此我无法使用glBlitFramebuffer() (据我所尝试, QOpenGLWidget::defaultFramebufferObject()返回0导致glBlitFramebuffer给出我的错误)。

我设法使渲染正常工作的唯一方法是使用QOpenGLFrameBuffer并在要与四边形一起使用纹理时调用takeTexture() 但是,以这种方式进行操作意味着QOpenGLFrameBuffer会自己创建一个新纹理,使用后我必须销毁旧纹理,这似乎效率很低。

有什么我可以解决的问题吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM