2017-08-21 16 views
0

私は3DレンダリングのためにOpenSceneGraphでQQuickControls 2(SwipeView)を使用しています。統合にはQQuickFramebufferObjectを使用してください。QQuick + OpenSceneGraphフリッカー

私はSwipeViewを導入して以来、私は私のGUIのいくつかのちらつきを観察します。

私は文書の年齢を探しています(これはおそらく数週間で要約されます)。なぜこのちらつきがあるのか​​はまったく分かりません。

Here is a video of the faulty behavior(フリッカリングは約20秒で開始します)。

class OsgRenderer : public QQuickFramebufferObject::Renderer 
{ 
public: 
    explicit OsgRenderer(); 

    QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) LC_OVERRIDE; 
    void synchronize(QQuickFramebufferObject* item) LC_OVERRIDE; 
    void render() LC_OVERRIDE; 

protected: 
    friend class OsgWindow; 

    OsgItem* m_osgItem; 
}; 

void OsgRenderer::render() 
{ 
    assert(m_osgItem); 

    if (!m_osgItem->getViewer()) 
     return; 

    // Without this line the model is not displayed in the second 
    // and subsequent frames. 
    QOpenGLContext::currentContext()->functions()->glUseProgram(0); 

    // Ask OSG to render. 
    m_osgItem->getViewer()->frame(); // WARNING: non-blocking (executed in a thread of its own - in a thread-safe way). 

    // Reset OpenGl state for QtQuick. 
    m_osgItem->window()->resetOpenGLState(); 
} 

ことから来ることができる場所の任意のアイデア:

そして、ここでは私のレンダリングコードですか?

+0

QQuickFrameBufferObjectで 'update'を呼び出すと、タイマーを使って頻繁にシーンを更新しますか?私は、ちらつきの理由は、Qt Quickが自動的にバックグラウンドアイテムの更新頻度を減らすためです。 –

+0

@ジミー:QQuickFramebufferObject :: update()を実際に呼び出します(QQuickFramebufferObjectの外部からは、内部ではなく - とにかく大きな違いがあります)。あなたが言及しているこの更新頻度の差異、それがどのように私に影響するのか、そして私が何をすることができるのか、私は理解していません。何か案が? – arennuit

答えて

1

一般に、QtQuickとOSGの両方を同じOpenGLコンテキストにレンダリングさせることはお勧めできません。
OSGフレーム間でGL状態を内部的に保持していますが、Qtがosgに通知せずに「外部」から変更する可能性があり、レンダリングの問題が発生する可能性があります。
より固いアプローチは、別々の(そして共有の)GLコンテキストを使用し、Qtが使用するテクスチャにfbo osgのリダイナーのコンテキストをコピーさせることです。
私はこのアプローチをここで成功させました:https://github.com/rickyviking/qmlosg しかし、最近のバージョンのQtQuickではテストしていません。
ここでは、最新の統合についてはこちらをご覧ください:https://github.com/podsvirov/osgqtquick

+0

QQuickFramebufferObjectは実際にレンダラー自体によって作成された別のFBOにレンダリングします。私は** QQuickFramebufferObject **は実際にあなたのコードを書いたときに2013年に存在しなかったと信じていますが、あなたの発言は関係していると思います。私は実際に[ここで私の質問を洗練した](https://stackoverflow.com/questions/45821638)。 – arennuit

+0

@あなたは正しいですが、QQuickFramebufferObjectは2013年には存在しませんでしたが、私が見てきたことは、主にレンダリングの指示を実行するコンテナクラスです。 GLコンテキストに関するすべての懸念事項はまだ有効です。この新しいクラスで動作するように実装を調整する必要があります – rickyviking

+0

面白い、ありがとう! – arennuit

関連する問題