【问题标题】:OpenGL multithreading in Qt, problems with glGet* resultsQt 中的 OpenGL 多线程,glGet* 结果的问题
【发布时间】: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 是否在绘制场景后保留矩阵?有什么办法可以让这段代码线程安全吗?

【问题讨论】:

    标签: multithreading qt opengl qglwidget


    【解决方案1】:

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

    【讨论】:

    • 谢谢 :-D 不幸的是,我不知道当时我做了什么让它发挥作用,但你的建议很中肯。我完全忘记了这个问题,我随机返回了个人资料 - 所以在这里我将其标记为正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多