мы рассматривали возможность использования прозрачных виджетов в качестве оверлеев для людоеда. Хотя Qwidget по умолчанию прозрачны, наложение их на виджет Ogre отличается, и возникает черный экран. На форуме людоеда (http://www.ogre3d.org/forums/viewtopic.php?f=2&t=42733) я нашел следующее:
«Хорошо, чтобы правильно изложить свои идеи, я собираюсь обобщить различные подходы, которые я нашел для объединения Ogre и Qt:
Создайте окно (не обязательно QGLWidget) с помощью Qt и передайте его дескриптор окна в Ogre с помощью флага externalWindowHandle. Затем Ogre создает контекст и полностью отвечает за него. Это в основном то, что я сделал для первой демо, которую я сделал. Его преимущество в том, что он должен поддерживать как OpenGL, так и Direct3D, а также должен работать на всех платформах. Большим недостатком является то, что виджеты Qt можно только накладывать друг на друга (не интегрировать), поэтому вы не получите приятной прозрачности.
Подход, аналогичный (1), но с той разницей, что буфер кадра явно считывается из Ogre и используется в качестве фона виджета. Это снова будет работать на всех системах и платформах рендеринга, и теперь Qt может выполнять правильный композитинг из прозрачности. Тем не менее, это потенциально медленная работа с необходимостью считывать каждый кадр и копировать его в Qt. Но это может стать хорошим «запасным» подходом. Я еще не пробовал его реализовать.
Это «правильный» подход, который мы действительно рассматриваем в этой теме. Это включает в себя как 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