2017-09-18 8 views
2

私のアプリケーションには、OpenGLを使用して何かをペイントする第三者コードが含まれています。私ができるのは、フルスクリーンの表面とマウス/タッチスクリーンイベントを提供することだけです。私はフルスクリーンサイズのItemを作成して、そのサードパーティのレンダリングのために残すことができます。レンダリングは、ビューを更新するために私のためにいくつかの信号を(おそらくQMetaObject::invokeMethodによって任意のスレッドから)放出します。コンテキストにペイントするQMLを一時的にブロックする方法は?サードパーティレンダリング用の空のQMLアイテムのOpenGLコンテキストを提供するには?

上記はどのように実装できますか?このようなワークフローを作成することは技術的に可能ですか?

希望を達成するためにもっと賢明な方法がありますか?多分FBOを使うほうがいいでしょうか?

これを非同期で行うことはできますか?私。そのレンダリングには独自のメッセージキューが別のスレッドにあります。

+3

です統合のための様々なオプション。それは質問をより具体的にするのに役立ちます。 – Velkan

答えて

2

QQuickFramebufferObjectを見てください。

それが動作する方法:

あなたはサブクラスを作成し、QMLでそれをインスタンス化します。あなたは、あなたがその間隙Renderer::render()の内側に置くすべてのコードがFBOItemに影響を与えますし、画面に描画されるレンダラhttp://doc.qt.io/qt-5/qquickframebufferobject-renderer.html

の独自のサブクラスを作成し、その

Renderer *QQuickFramebufferObject::createRenderer() 

をオーバーライドする必要があります。 QtはあなたのFBOを拘束します。

UIで変更を呼び出す必要がある場合は、void Renderer::update()を呼び出します。

サードパーティのレンダラーは、描画する必要があるときにこのメソッドを呼び出す必要がありますが、すべてのOpenGLメソッド(glDrawArrays ...)はレンダラーのレンダリング関数内に記述する必要があります。このメソッドにアクセスする前に、FBOをバインドしてください。たぶんあなたのQQuickFramebufferObjectは、ThirdPartyシグナルを聞いて、(いくつかの状態やstd ::関数を介して)そのレンダラーコンポーネントのレンダリングメソッドを変更し、更新を呼び出す必要があります。ここで

は、いくつかの良い例は、[Qtのクイックシーングラフ](http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html)ドキュメントページで説明

http://blog.qt.io/blog/2015/05/11/integrating-custom-opengl-rendering-with-qt-quick-via-qquickframebufferobject/

関連する問題