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 线程中使用
QGLWidget
、QGLPixelbuffer
或 QGLContext
创建上下文和要绘制到的 QGLFramebufferObject
- 通过
doneCurrent()
释放GUI线程中的上下文
- 在绘图线程中,在上下文中调用
makeCurrent()
,然后使用QPainter
在QGLFramebufferObject
上进行绘图。您可以对原始 OpenGL 命令使用 beginNativePainting()
/endNativePainting()
。
- 在 GUI 线程中,在帧缓冲区对象上调用
toImage()
以获得 QImage
或在 QGLWidget
. 上使用 drawTexture()
重要提示: QGLContext
不是线程安全的,因此您可能需要确保不要同时在多个线程中使用上下文。
我希望使用 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 线程中使用
QGLWidget
、QGLPixelbuffer
或QGLContext
创建上下文和要绘制到的QGLFramebufferObject
- 通过
doneCurrent()
释放GUI线程中的上下文
- 在绘图线程中,在上下文中调用
makeCurrent()
,然后使用QPainter
在QGLFramebufferObject
上进行绘图。您可以对原始 OpenGL 命令使用beginNativePainting()
/endNativePainting()
。 - 在 GUI 线程中,在帧缓冲区对象上调用
toImage()
以获得QImage
或在QGLWidget
. 上使用
drawTexture()
重要提示: QGLContext
不是线程安全的,因此您可能需要确保不要同时在多个线程中使用上下文。