1

我正在使用 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 是否在绘制场景后保留矩阵?有什么方法可以使这段代码线程安全吗?

4

1 回答 1

0

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

于 2012-06-07T14:33:44.950 回答