Многопоточность OpenGL в Qt, проблемы с результатами glGet*

Я кодирую графическое приложение в 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);

чтобы получить экранные координаты [x;y] точки [px;py;pz] и использовать их при вычислении следующего шага моделирования. Оказывается, основной поток всегда получает правильные массивы modelviewMatrix и projectMatrix, но когда это выполняется вычислительным потоком, он получает данные матрицы мусора. Я пробовал много вещей... запускал makeCurrent() перед запросом OpenGL, блокируя любые действия OpenGL, чтобы матрицы не трогались, но безуспешно. Интересно, это вообще возможно? Сохраняет ли OpenGL матрицы после отрисовки сцены? Есть ли способ сделать этот фрагмент кода потокобезопасным?


person dzuremar    schedule 07.06.2012    source источник


Ответы (1)


Выполняйте запросы GL в основном потоке и передайте результаты в поток вычислений.

person genpfault    schedule 07.06.2012
comment
Спасибо :-D, к сожалению, я понятия не имею, что я сделал, чтобы заставить его работать в тот раз, но ваш совет очень точен. Я совсем забыл о вопросе и случайно вернулся в профиль - так что здесь я отметил его как правильный ответ. - person dzuremar; 20.07.2015