Qt 中的 OpenGL 多线程,glGet* 结果的问题

Posted

技术标签:

【中文标题】Qt 中的 OpenGL 多线程,glGet* 结果的问题【英文标题】:OpenGL multithreading in Qt, problems with glGet* results 【发布时间】:2012-06-07 13:31:28 【问题描述】:

我正在使用 QGLWidget 和 OpenGL 在 Qt (4.8.2)(VS 2008) 中编写图形应用程序。这是应用程序的简短描述:这是一个物理模拟。它由 2 个线程组成。主应用程序线程处理场景绘制(QGLWidget 子类)和事件。计算线程在循环中计算模拟的下一步。 现在...我想使用光标(拖动对象或类似的东西)与模拟进行交互。由于我决定不在场景中进行智能射线拍摄以及一些空间空间分解(也许我必须这样做),我希望计算线程执行如下操作:

    glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
    glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
    glGetIntegerv(GL_VIEWPORT, viewport);
    gluProject(px, py, pz, modelviewMatrix, projectionMatrix, viewport, &x, &y, &z);

为了获得 [px;py;pz] 点的屏幕 [x;y] 坐标,并将它们用于计算模拟的下一步。好吧,事实证明主线程总是得到正确的 modelviewMatrix 和 projectionMatrix 数组,但是当它由计算线程执行时,它会得到垃圾矩阵数据。我尝试了很多事情......在查询 OpenGL 之前运行 makeCurrent(),锁定任何 OpenGL 操作,因此矩阵应该不受影响,但没有成功。我想知道,这甚至可能吗? OpenGL 是否在绘制场景后保留矩阵?有什么办法可以让这段代码线程安全吗?

【问题讨论】:

【参考方案1】:

在主线程中执行 GL 查询并将结果传递给您的计算线程。

【讨论】:

谢谢 :-D 不幸的是,我不知道当时我做了什么让它发挥作用,但你的建议很中肯。我完全忘记了这个问题,我随机返回了个人资料 - 所以在这里我将其标记为正确答案。

以上是关于Qt 中的 OpenGL 多线程,glGet* 结果的问题的主要内容,如果未能解决你的问题,请参考以下文章

强制 OpenGL 渲染始终在 Qt 中的相同 (Q) 线程上运行

分离线程中的 Qt4/Opengl bindTexture

将 Qt GUI 拆分为多个线程用于 GUI、模拟和 OpenGL 是不是可行?

Qt 5.1 带有共享 QGLWidgets 的线程化 OpenGL

在 Qt 线程中应用 OpenGL 着色器

Qt 线程似乎并没有在内核上平均共享