我正在Qt(4.8.2)(VS 2008)中编写图形应用程序,使用QGLWidget,因此使用OpenGL。以下是应用程序的简短描述:这是一个物理模拟。它由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是否保留矩阵?有什么方法可以使这段代码线程安全吗?
答案 0 :(得分:0)
在主线程中执行GL查询并将结果传递给您的计算线程。