我希望使用OpenGL在单独的线程中渲染到屏幕外缓冲区。我不需要与主线程共享上下文。以前,我在Qt 5.4中使用了QOpenGLContext类,我在主线程中初始化,然后使用moveToThread和makeCurrent方法移动到工作线程。这对我的需求很好,但是现在我必须将它向后移植到Qt 4.8。我尝试自己初始化一个QGLContext,但是当我在它上面调用create时,它只返回false,我无法理解我的错误是什么。在Qt 4.8中执行此操作的正确方法是什么?
答案 0 :(得分:2)
在Qt 4中,上下文应始终保留在GUI线程中。但是在Qt 4.8中,你有点幸运:
从Qt 4.8开始,可以在单独的线程中使用QPainter绘制到QGLFramebufferObject中。请注意,OpenGL 2.0或OpenGL ES 2.0是必需的。此外,在X11下,设置Qt :: AA_X11InitThreads应用程序属性是必要的。
以下是您需要做的事情:
Qt::AA_X11InitThreads
应用程序属性QGLWidget
,QGLPixelbuffer
或QGLContext
来创建上下文和要绘制到的QGLFramebufferObject
doneCurrent()
makeCurrent()
,然后使用QPainter
在QGLFramebufferObject
上绘图。您可以将beginNativePainting()
/ endNativePainting()
用于原始OpenGL命令。toImage()
以获取QImage
或使用drawTexture()
上的QGLWidget
。 重要提示: QGLContext
不是线程安全的,因此您可能需要确保一次不在多个线程中使用上下文。