我有以下OpenGL设置来解决帧缓冲区问题:
当进程的两个阶段都在同一个上下文中完成时,这可以正常工作,但如果阶段1在阶段2的不同上下文中完成,则会中断(请注意,这些上下文都是共享的,并且都在同一个线程上)。在这种情况下,当我调整视口大小(重新创建帧缓冲区)时,我只看到显示的多维数据集。立方体有时会被破坏或碎片化,这使我相信所有我看到的都是纹理在调整大小之前使用的内存部分,并且没有任何东西能够正常显示。
我必须进行此设置的原因是,在我的实际应用程序中,我使用Qt OpenGL小部件,这些小部件被迫使用他们自己的单独上下文,所以我必须在自己的专用上下文中渲染我的场景然后使用可共享的OpenGL资源将其复制到相关的视口。如果我不这样做,我会因在其他环境中绑定/使用VAO而导致错误。
我尝试过以下不成功的组合(其中主要上下文是我使用纹理绘制四边形的位置,以及辅助上下文,其中" offscreen"将多维数据集渲染到框架中缓冲发生):
此外,我无法使用glBlitFramebuffer()
,因为我无法访问QOpenGLWidget
在应用程序中使用的帧缓冲区(就我而言)试过,QOpenGLWidget::defaultFramebufferObject()
返回0,导致glBlitFramebuffer
给我错误。
我设法让渲染工作的唯一方法是使用QOpenGLFrameBuffer
并在我想要使用四边形纹理时调用takeTexture()
。然而,这样做意味着QOpenGLFrameBuffer
创建了一个新的纹理,我必须在使用它之后销毁旧的纹理,这看起来非常低效。
我能解决这个问题吗?
答案 0 :(得分:1)
我有一个使用类似纹理的项目。在绘制之后和使用glFinish()
中的纹理之前,您需要调用QOpenGLFramebufferObject::texture()
。这是我们在一些操作系统上的问题。