1

私はカスタム OpenGL レンダラーで QtQuick を使用しています (QtQuick の観点からは、単にOpenSceneGraphであるためカスタムです)。そのために、QQuickFramebufferObject から継承するカスタム QQuickItem を作成し、QQuickFramebufferObject :: RendererからQQuickFramebufferObject ::createRenderer()を継承するカスタム レンダラーを作成します。これは十分に文書化されており、これらの手順に問題はありません。

後でアクセスするために、QQuickFramebufferObject::createRenderer()で作成されたレンダラーが実際にキャッシュされます (実際にはQQuickFramebufferObjectコンストラクターでインスタンス化され、単にQQuickFramebufferObject::createRenderer()で返されます。これは正常に動作し、次のことができます。作成されたレンダラーは、後でgeometryChangedmousePressEventなどのイベントに反応するために使用されるため、他の簡単なコーディング方法はありません。

////////////////////////////////////////////////////////////////////////////////
void OsgItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
{
    if (m_renderer)
        m_renderer->m_window->getEventQueue()->windowResize(newGeometry.x(), newGeometry.y(), newGeometry.width(), newGeometry.height());


    QQuickFramebufferObject::geometryChanged(newGeometry, oldGeometry);
}

////////////////////////////////////////////////////////////////////////////////
void OsgItem::mousePressEvent(QMouseEvent *event)
{
    m_renderer->m_window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button(*event));

    update();
}

ここで、OsgItem は私のカスタムQQuickFramebufferObjectで、m_rendererは私のカスタムQQuickFramebufferObject::Rendererです。

問題は、createRenderer()が const であることです (これは、実際にはキャッシュすることを勧めるものではありません)。この論文では、レンダラーをキャッシュすべきではないと明確に述べています (ただし、公式ドキュメントには記載されていません)。

ここでのキャッチは何ですか?見逃したものはありますか?物事をコーディングできる別のクリーンな方法がわかりますか?

4

2 に答える 2

3

Velkan は、Raw/Custom OpenGL を と統合するという原則を提供しましたQQuickFramebufferObject。OSG と QtQuick を統合するプロジェクトを終えたばかりなので、私たちの経験の一部を共有したいと思います。

はい、もちろん、レンダラーをキャッシュするべきではありません。これcreateRendererが const であるのには理由があり、それが Qt チームがクラスを設計した方法です。私たちの実験によると、createRenderer関数は複数回呼び出される場合があります。

QQuickFramebufferObject とそのレンダラーの間で同期するにはQQueue、QQuickFramebufferObject に を追加し、関心のあるイベントが発生したときにそれらをキューに入れます。レンダラーでは、synchronizeが呼び出されると、キューを fbo からレンダラーにコピーし、render関数で特定の操作を実行します。

于 2016-08-21T08:28:29.100 に答える