使用Qt 4.8在单独的线程中打开OpenGL屏幕

时间:2015-03-25 09:46:41

标签: c++ multithreading opengl qt4.8

我希望使用OpenGL在单独的线程中渲染到屏幕外缓冲区。我不需要与主线程共享上下文。以前,我在Qt 5.4中使用了QOpenGLContext类,我在主线程中初始化,然后使用moveToThread和makeCurrent方法移动到工作线程。这对我的需求很好,但是现在我必须将它向后移植到Qt 4.8。我尝试自己初始化一个QGLContext,但是当我在它上面调用create时,它只返回false,我无法理解我的错误是什么。在Qt 4.8中执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

在Qt 4中,上下文应始终保留在GUI线程中。但是在Qt 4.8中,你有点幸运:

  

从Qt 4.8开始,可以在单独的线程中使用QPainter绘制到QGLFramebufferObject中。请注意,OpenGL 2.0或OpenGL ES 2.0是必需的。此外,在X11下,设置Qt :: AA_X11InitThreads应用程序属性是必要的。

以下是您需要做的事情:

  • 在X11下操作时,请使用Qt::AA_X11InitThreads应用程序属性
  • 在GUI线程中使用QGLWidgetQGLPixelbufferQGLContext来创建上下文和要绘制到的QGLFramebufferObject
  • 通过doneCurrent()
  • 在GUI线程中释放上下文
  • 在绘图主题中,在上下文中调用makeCurrent(),然后使用QPainterQGLFramebufferObject上绘图。您可以将beginNativePainting() / endNativePainting()用于原始OpenGL命令。
  • 在GUI主题中,在framebuffer对象上调用toImage()以获取QImage或使用drawTexture()上的QGLWidget

重要提示: QGLContext不是线程安全的,因此您可能需要确保一次不在多个线程中使用上下文。