2015-11-12 4 views
0

Мне нужно написать приложение, в котором основное содержимое будет отображаться в OpenGL (что-то вроде движка игры), но нет хорошей библиотеки GUI на основе OpenGL, аналогичной тому, что делают виджеты Qt (но они представляют собой программные средства).Смешивание OpenGL и программного обеспечения, созданного GUI

Как я просматривал исходный код Qt, все рисунки выполняются через QPainter, и в OpenGL реализована даже реализация QPainter, но suppport для нескольких графических бэкэндов был сброшен в Qt 5, поэтому вы не можете отображать Qt Widgets в OpenGL больше (я не знаю почему).

Проблема заключается в том, что вы не можете рисовать поверхность окна, используя как программную, так и аппаратную визуализацию. Вы можете иметь окно, связанное с контекстом OpenGL, или использовать рендеринг программного обеспечения. Это означает, что если я хочу иметь приложение со сложным графическим интерфейсом с содержимым на основе OpenGL, мне нужно либо нарисовать все, используя OpenGL (что сложно, потому что, как я уже сказал, для него нет хорошей библиотеки GUI), или я могу визуализировать GUI для изображения, используя (например, Qt), а не загружать это изображение как текстуру OpenGL (возможно, большую потерю производительности).

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

+1

Не могли бы вы сделать это по-другому? Отнесите сцену OpenGL к текстурной карте, а затем поместите эту текстуру в виде 2D-элемента внутри вашего графического интерфейса. Я думаю, что этот метод больше похож на то, что делают веб-браузеры, компонуя холст на HTML-странице. – emackey

+1

emackey: да, это должно быть возможно, но это, вероятно, означает загрузку содержимого из памяти графического процессора в ОЗУ и отображение его как изображения, поэтому в итоге переместить его из ОЗУ в графический процессор. – Krab

+0

Добавьте тег 'OpenGL', чтобы получить больше ответов :) – emackey

ответ

-1

Если вы берете «рендеринга ui на текстуру, а затем нарисуйте текстурированный квадрат по моей игре» и беспокоитесь о выступлениях, старайтесь избегать передачи всей текстуры в каждый кадр.

Если вы думаете об этом:

60fps не является необходимым для Ui: 30 кадров в секунду достаточно, поэтому обновлять его один раз из двух.

В большинстве случаев, ui не меняет между кадрами, и если он изменяется, то только небольшая его часть.

ui framework часто отслеживает, какая часть ui «грязная», и ее необходимо перерисовать. Если вы можете воспользоваться этим, вы можете передать текстуре только те части, которые необходимо обновить (glTexSubImage2D).

Смежные вопросы