gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:28 24 4
gpt4 key购买 nike

我希望在单独的线程中使用 OpenGL 渲染到屏幕外缓冲区。我不需要与主线程共享上下文。以前,我在 Qt 5.4 中使用 QOpenGLContext 类,我在主线程中初始化它,然后使用它的 moveToThread 和 makeCurrent 方法移动到工作线程。这很好地满足了我的需要,但现在我必须将它移植到 Qt 4.8 。我尝试自己初始化一个 QGLContext,但是当我在其上调用 create 时,它​​只返回 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应用属性
  • 使用 QGLWidget , QGLPixelbufferQGLContext在 GUI 线程中创建上下文和 QGLFramebufferObject你想融入其中
  • 通过 doneCurrent() 释放 GUI 线程中的上下文
  • 在绘图线程中,调用 makeCurrent()在上下文中,然后使用 QPainterQGLFramebufferObject上画画.您可以使用 beginNativePainting()/endNativePainting()用于原始 OpenGL 命令。
  • 在 GUI 线程中,调用 toImage()在帧缓冲区对象上获取 QImage或使用 drawTexture()QGLWidget 上.

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

关于c++ - OpenGL offscreen 在单独的线程中与 Qt 4.8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29252214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com