OpenGL offscreen 在单独的线程中与 Qt 4.8

OpenGL offscreen in separate thread with Qt 4.8

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

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

As of Qt 4.8, it's possible to draw into a QGLFramebufferObject using a QPainter in a separate thread. Note that OpenGL 2.0 or OpenGL ES 2.0 is required for this to work. Also, under X11, it's necessary to set the Qt::AA_X11InitThreads application attribute.

这是你必须做的:

  • X11下运行时,使用Qt::AA_X11InitThreads应用属性
  • 在 GUI 线程中使用 QGLWidgetQGLPixelbufferQGLContext 创建上下文和要绘制到的 QGLFramebufferObject
  • 通过doneCurrent()
  • 释放GUI线程中的上下文
  • 在绘图线程中,在上下文中调用makeCurrent(),然后使用QPainterQGLFramebufferObject上进行绘图。您可以对原始 OpenGL 命令使用 beginNativePainting()/endNativePainting()
  • 在 GUI 线程中,在帧缓冲区对象上调用 toImage() 以获得 QImage 或在 QGLWidget.
  • 上使用 drawTexture()

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