2012-06-07 3 views
1

QGLWidget과 OpenGL을 사용하여 Qt (4.8.2) (VS 2008)에서 그래픽 응용 프로그램을 코딩하고 있습니다. 다음은 응용 프로그램에 대한 간단한 설명입니다. 물리 시뮬레이션입니다. 그것은 2 개의 스레드로 구성됩니다. 메인 어플리케이션 스레드는 씬 드로잉 (QGLWidget 서브 클래스)과 이벤트를 처리합니다. 컴퓨팅 쓰레드는 시뮬레이션의 다음 단계를 계산하는 루프에 있습니다. 지금 ... 커서 (객체 또는 비슷한 물건 끌기)를 사용하여 시뮬레이션과 상호 작용하고 싶습니다. 나는 약간의 공간 공간 분해 (어쩌면 내가 Afterall는 그것을해야 할 것이다)와 함께 현장에서 지능형 레이 촬영을하지 않기로 결정 이후,이 같은 것을 실행하는 컴퓨팅 스레드를 싶습니다Qt의 OpenGL 멀티 스레딩, glGet * 결과의 문제

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

메인 스레드에서 GL 쿼리를 수행하고 결과를 계산 스레드로 전달하십시오.

+0

감사합니다 .- 불행히도 나는 그 시간에 일을하기 위해 무엇을했는지 전혀 알지 못하지만, 귀하의 충고는 꽤 자리하고 있습니다. 나는 그 질문에 대해 완전히 잊어 버렸고 무작위로 프로필로 돌아왔다. 그래서 나는 그것을 정답으로 표시했다. – dzuremar