2012-11-28 28 views
13

私はカスタムのopengl呼び出しをqtquick 2.0の項目の中でレンダリングする方法を探しています。あなたにいくつかのコンテキストを与えるために:私は、レンダリングのためにOpenGLを使用するC++の3Dエンジンを持っています。目標はqtquick 2.0 UI内でレンダリングすることです。qt5のqtquick 2.0でカスタムOpenGLをレンダリング

私が知ったのは、プレqt 5.0(qtquick 2.0)はQtGlWidgetを使用してQDeclarativeViewに埋め込むことです。私が見つけた別の方法は、QtDeclarativeItemを使用し、void QDeclarativeItem :: paint(QPainter * p、const QStyleOptionGraphicsItem * o、QWidget * w)メソッドをオーバーライドすることです。

私が理解しているように、QtQuick 2.0はOpenGlに基づいた新しいレンダラーを使用しているため、これはもう不可能です。したがって、ペイントメソッドをオーバーライドするほど簡単ではないようです。

誰かが私のopengl呼び出しのレンダリングを可能にするQQuickItemを実装する方法を知っていますか?

答えて

3

3Dエンジンではテクスチャにレンダリングし、QQuickItemにはQSGSimpleTextureNodeを使用してレンダリング結果を表示します。 QtQuickは独自のGL状態を維持していますが、これは混乱する可能性があります。そのため、カスタムコンテンツを表示するためにQSGクラスのみを使用することをお勧めします。基本的には、プレーンなQtQuickは3Dコンテンツではなく、長方形をレンダリングするためのツールです。

(ラメ)例:

QScopedPointer<QSGTexture> texture_; 

QSGNode* MyItem::updatePaintNode(QSGNode* node, UpdatePaintNodeData*) 
{ 
    if (width() <= 0 || height() <= 0) 
    { 
    texture_.reset(); 

    delete node; 
    return 0; 
    } 
    else 
    { 
    if (!node) 
    { 
     node = new QSGSimpleTextureNode; 

     static_cast<QSGSimpleTextureNode*>(node) 
     ->setFiltering(QSGTexture::Nearest); 
    } 
    // else do nothing 

    static_cast<QSGSimpleTextureNode*>(node)->setRect(boundingRect()); 

    getTheTextureFrom3DEngine(texture_); 

    Q_ASSERT(texture_); 
    static_cast<QSGSimpleTextureNode*>(node)->setTexture(texture_.data()); 

    return node; 
    } 
} 

また、内容を更新するためにタイマーをインスタンス化する必要があります。これはQQuickItem内から行うことができます。

8

2つのうちのいずれかを実行できます。 QQuickWindow::beforeRenderingまたはQQuickWindow::afterRenderingシグナルを使用してフックすることで、コンテンツをテクスチャにレンダリングするか、シーングラフのOpenGLコンテキストでレンダリングします。

FBOとテクスチャを使用する方法の例は、ここで見つけることができます:シーングラフのOpenGLのコンテキストに直接描画する方法についてhttp://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html

の例では、ここで見つけることができます:http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html

+0

FBO(用Qt 5.2):http://qt.apidoc.info/5.2.0/qtquick/qtquick-scenegraph-textureinsgnode-example.html シーングラフ - QML(Qt 5の場合)のOpenGL:http:// qt-project。 org/doc/qt-5/qtquick-scenegraph-openglunderqml-example.html – troyane

関連する問題