鬼のオーバーレイとして透明なウィジェットを使用することを検討してきました。Qwidgetsはデフォルトでは透過的ですが、Ogreウィジェット上にオーバーレイすることは異なり、黒い画面が発生します。鬼フォーラム(http://www.ogre3d.org/forums/viewtopic.php?f=2&t=42733)で私は以下を見つけました:
「わかりました。私の考えをまっすぐにするために、OgreとQtを組み合わせるために見つけたさまざまなアプローチを要約します。
Qtを使用してウィンドウ(必ずしもQGLWidgetである必要はありません)を作成し、「externalWindowHandle」フラグを使用してそのウィンドウハンドルをOgreに渡します。次に、Ogreはコンテキストを作成し、それに対して完全に責任を負います。これは基本的に、私が最初に作成したデモで行ったことです。OpenGLとDirect3Dの両方をサポートし、すべてのプラットフォームで機能するという利点があります。大きな欠点は、Qtウィジェットはオーバーレイ(統合されていない)しかできないため、優れた透明性が得られないことです。
(1)と同様のアプローチですが、フレームバッファーがOgreから明示的に読み戻され、ウィジェットの背景として使用される点が異なります。これもすべてのレンダリングシステムとプラットフォームで機能し、Qtは透過性から適切な合成を実行できるようになりました。ただし、すべてのフレームを読み戻してQtにコピーする必要があるため、非常に時間がかかる可能性があります。しかし、これは良い「フォールバック」アプローチになる可能性があります。私はまだそれを実装しようとはしていません。
これは、このスレッドで実際に検討している「適切な」アプローチです。これには、OpenGLコンテキストを所有するOgreとQtの両方が含まれ、両方が同じウィジェットにレンダリングされます。このウィジェットはQGraphicsView/QGraphicsSceneの背景として設定され、他のウィジェットは適切な透明効果で上書きできます。これはOpenGLでのみ機能し、(理論的には)クロスプラットフォームです。2つのバリエーションがあります。
Ogreが独自のOpenGLコンテキストを作成し(フラグ'externalGLControl'を渡す)、createRenderWindow()が終了したらコンテキストを取得できるようにします。Windowsの下には、このためのwglGetCurrentDC()とwglGetCurrentContext()があります。他のプラットフォームにも同様のものが必要です。
QtにOgreに代わってコンテキストを作成させ、「externalGLContext」フラグを使用してそれをOgreに渡します。この場合、Ogreは基本的に、提供されたコンテキストにレンダリングする以外は何もしません。すべてのコントロールはQtを使用します。QtとOgreの両方でクラッシュが発生していたため、これはまだ機能していません。」
アプローチ1は私たちがプロジェクトで従ったものであり、上記のように、透明性に関して同じ問題が発生しました。アプローチ3は可能ですが、openGLに限定することになります。そのためのコードは、フォーラムリンクの1ページ3にあります。
デモビデオも見つけましたが、どのように実装されたかはわかりませんが、とてもクールに見えます:http: //youtu.be/b_3xfFuwGOQ