2015-03-25 60 views
2

我希望使用OpenGL渲染到一个单独的线程中的离线缓冲区。我不需要与主线程共享上下文。以前,我在Qt 5.4中使用了QOpenGLContext类,它在主线程中初始化,然后使用其moveToThread和makeCurrent方法移至工作线程。这对我的需求很好,但现在我必须将它恢复到Qt 4.8。我尝试着自己初始化一个QGLContext,但是当我调用create时,它只返回false,我不明白我的错误是什么。在Qt 4.8中做这件事的正确方法是什么?OpenGL离线与Qt 4.8分开的线程

回答

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应用属性
  • 使用QGLWidgetQGLPixelbufferQGLContext在GUI线程创建上下文和QGLFramebufferObject这你想绘制成
  • 在GUI线程中释放上下文通过doneCurrent()
  • 在图纸中d,在上下文中调用makeCurrent(),然后使用QPainterQGLFramebufferObject上进行绘图。您可以使用beginNativePainting()/endNativePainting()作为原始OpenGL命令。
  • 在GUI线程中,请在帧缓冲区对象上调用toImage()以获取QImage或在QGLWidget上使用drawTexture()

重要:QGLContext是不是线程安全的,所以你可能需要确保你没有在同一时间使用上下文的多个线程。

+1

完美的作品,谢谢。 – Moshev 2015-03-25 11:25:39

+0

太棒了,因为我从来没有尝试过它! – ypnos 2015-03-25 13:49:56