Прозрачный Qt-виджет и Ogre

мы рассматривали возможность использования прозрачных виджетов в качестве оверлеев для людоеда. Хотя Qwidget по умолчанию прозрачны, наложение их на виджет Ogre отличается, и возникает черный экран. На форуме людоеда (http://www.ogre3d.org/forums/viewtopic.php?f=2&t=42733) я нашел следующее:

«Хорошо, чтобы правильно изложить свои идеи, я собираюсь обобщить различные подходы, которые я нашел для объединения Ogre и Qt:

  1. Создайте окно (не обязательно QGLWidget) с помощью Qt и передайте его дескриптор окна в Ogre с помощью флага externalWindowHandle. Затем Ogre создает контекст и полностью отвечает за него. Это в основном то, что я сделал для первой демо, которую я сделал. Его преимущество в том, что он должен поддерживать как OpenGL, так и Direct3D, а также должен работать на всех платформах. Большим недостатком является то, что виджеты Qt можно только накладывать друг на друга (не интегрировать), поэтому вы не получите приятной прозрачности.

  2. Подход, аналогичный (1), но с той разницей, что буфер кадра явно считывается из Ogre и используется в качестве фона виджета. Это снова будет работать на всех системах и платформах рендеринга, и теперь Qt может выполнять правильный композитинг из прозрачности. Тем не менее, это потенциально медленная работа с необходимостью считывать каждый кадр и копировать его в Qt. Но это может стать хорошим «запасным» подходом. Я еще не пробовал его реализовать.

  3. Это «правильный» подход, который мы действительно рассматриваем в этой теме. Это включает в себя как Ogre, так и Qt, владеющие контекстами OpenGL, и оба рендеринга в один и тот же виджет. Этот виджет устанавливается в качестве фона QGraphicsView/QGraphicsScene, и другие виджеты могут быть перекрыты соответствующими эффектами прозрачности. Он работает только с OpenGL и является (теоретически) кроссплатформенным. Есть два варианта:

    • Разрешить Ogre создать свой собственный контекст OpenGL (передав флаг «externalGLControl»), а затем получить контекст после завершения createRenderWindow(). Под окнами для этого есть wglGetCurrentDC() и wglGetCurrentContext() — на других платформах должно быть что-то подобное.

    • Пусть Qt создаст контекст от имени Ogre и передаст его Ogre, используя флаг «externalGLContext». В этом случае Ogre в основном ничего не делает, кроме рендеринга в тот контекст, который он предоставил — все управление находится в Qt. Я еще не совсем заработал, так как у меня были сбои и в Qt, и в Ogre».

Подход 1 — это тот, который мы использовали для проекта, и, как сказано выше, мы столкнулись с той же проблемой с прозрачностью. Подход 3 возможен, но мы ограничимся openGL. Код для этого доступен на странице 3 ссылки на форуме.

Мы также нашли демонстрационное видео, но я не могу найти, как оно было реализовано, но выглядит очень круто: http://youtu.be/b_3xfFuwGOQ


person Nikolaos Giotis    schedule 12.11.2012    source источник


Ответы (2)


Теперь вы можете найти реализацию второго варианта вашего третьего предложенного подхода в обновленном примере QmlOgre по адресу https://github.com/advancingu/QmlOgre В исходном примере было несколько проблем, которые были исправлены здесь.

Надеюсь, это все еще поможет через несколько месяцев после вашего вопроса.

person advancingu    schedule 05.04.2013
comment
Не работает при использовании стандартной системы рендеринга Ogre OpenGL. Работает только с X11 или Win32GLES2. - person Jay; 10.09.2013
comment
Я не слышал о каких-либо конкретных проблемах с платформой. Не могли бы вы сообщить о проблеме на Github с дополнительной информацией? - person advancingu; 03.10.2013

*Вот код этого видео (http://youtu.be/b_3xfFuwGOQ). (Требуется Qt5) http://qt.gitorious.org/qt-labs/qmlogre

Существует также Cutexture (требуется Qt4) https://github.com/advancingu/Cutetexture http:// i56.tinypic.com/b6xb83.jpg

Вот пример виджета Qt4 Ogre. (Требуется Qt4) http://zester.googlecode.com/files/QtCreatorOgre2.zip *

person Nikolaos Giotis    schedule 19.12.2012