Arhn - архитектура программирования

Перерисовать opengl из другого потока

Я работаю над проектом, в котором у меня есть окно opengl и окно gtk, теперь я хочу иметь возможность управлять opengl из gtk.

В окне Gtk у меня есть кнопка, которая вызывает генератор изображений, и после этого я хотел бы перерисовать окно opengl, чтобы увидеть результат, но если я вызову функцию отображения из обратного вызова с нажатой кнопкой, ничего не произойдет. Единственное, что до сих пор работало, это когда я установил glutIdleFunc на свою функцию отображения, таким образом, окно opengl постоянно перерисовывалось, однако мне кажется, что должен быть лучший способ. Также я попробовал glutTimerFunc для проверки условных переменных, но опять же, есть ли лучший способ.

Моя идея состоит в том, чтобы иметь возможность сообщать/сигнализировать/вызывать непосредственно функцию отображения opengl или заставлять glutMainLoop выполнять итерацию всякий раз, когда я нажимаю кнопку, но я действительно не знаю, как это сделать.

Любые идеи?

08.10.2012

Ответы:


1

Во-первых, я настоятельно рекомендую вам прекратить использовать простой GLUT. Как только ваше приложение выросло до потребностей, которые вы описали (несколько окон, GTK+, ...), GLUT перестает быть достаточно гибким, чтобы быть работоспособным решением.

Взгляните, например, на GLFW в качестве подходящей замены, он гораздо более гибкий и на самом деле достаточно хорош для реальных приложений. использовать.

Во-вторых, вы упоминаете темы в своем заголовке, но не в теле вопроса, поэтому немного неясно, действительно ли вы используете темы. Если да, то вам нужно изучить потокобезопасные соединения. Библиотека glib, на которой построен GTK+, имеет несколько API для этого, проверьте их. Если не использовать потоки, вы, вероятно, можете обойтись несколькими прямыми вызовами функций и просто аннулировать состояние OpenGL, чтобы оно перерисовывалось.

08.10.2012
  • Я бы просто использовал виджет GTK GLArea. 08.10.2012

  • 2

    Любые идеи?

    Не используйте GLUT или GLFW или любой другой фреймворк OpenGL. Вы используете GTK+, так что придерживайтесь этого. Есть виджет OpenGL для GTK+. Используйте это. Так как ваш код OpenGL хорошо интегрируется с GTK+, вы можете использовать обычный механизм сигнальных событий GLib (используемый GTK+) без дальнейших церемоний.

    08.10.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..