Как нарисовать графику OpenGL из разных потоков? - PullRequest
4 голосов
/ 12 апреля 2009

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

Согласно тому, что я читал, Opengl является асинхронным, и вызов его функций из разных потоков может быть очень проблематичным. Есть ли способ, которым я мог бы использовать для решения этой проблемы? В идеале, я хотел бы нарисовать командную строку поверх трехмерной графики с некоторым эффектом прозрачности ... (я думаю, это невозможно в окнах просмотра)

Важно, чтобы решение было переносимым.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 12 апреля 2009

Возможно, вы сможете добиться того, что хотите, используя оверлеи.
Оверлеи являются устаревшей функцией, но все же должны поддерживаться в большинстве установок. По сути, оверлей - это отдельный контекст GL, который отображается в том же окне, что и другой слой, рисуя поверх того, что было нарисовано в окнах, с его исходным контекстом.
Вы можете прочитать об этом здесь .

2 голосов
/ 13 апреля 2009

Я думаю, что вместо того, чтобы пытаться создать два потока для рисования на экране, вам нужно использовать шаблон MVC и сделать вашу модель поточно-ориентированной. Затем у вас может быть один поток, который получает необходимую информацию из модели каждого кадра и выводит ее на экран, а затем два других потока, один для графики и один для командной строки, которые управляют только моделью.

Так, например, у вас есть класс Simulation, в котором есть 3D-графика, а затем класс CommandLine с вашей командной строкой. Каждый из этих классов вообще не использует OpenGL; только управляет данными, например, где вещи находятся в трехмерном пространстве, а в случае командной строки - очередь строк на экране. Затем поток opengl может запрашивать потокобезопасные функции этих классов в каждом кадре, чтобы получить необходимую информацию. Так, например, он захватывает позиции трехмерных объектов, рисует их на экране, затем захватывает линии, отображаемые в командной строке, и рисует их.

1 голос
/ 12 апреля 2009

Вы не можете сделать это с 2 окнами просмотра.

Каждый контекст OpenGL должен использоваться из того же потока, в котором он был создан.

Два отдельных дескриптора окна, каждый со своим собственным контекстом, могут быть безопасно настроены и использованы из двух отдельных потоков, но не из двух окон просмотра в одном окне.


Хорошее место, чтобы взглянуть на идеи для этого - OpenSceneGraph. Он проделывает большую работу с потоками, чтобы помочь попытаться ускорить обработку и поддерживать постоянную высокую частоту кадров при очень больших сценах.

Я успешно внедрил его и использовал его из 2-х отдельных потоков, но OSG имеет много проверок, чтобы помочь с таким сценарием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...