14

カスタム opengl 呼び出しを qtquick 2.0 アイテム内でレンダリングする方法を探しています。コンテキストを説明すると、レンダリングに opengl を使用する C++ 3d エンジンがあります。目標は、qtquick 2.0 UI 内でレンダリングすることです。

私が見つけたのは、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を実装する方法を知っている人はいますか?

4

2 に答える 2

3

3D エンジンでテクスチャにレンダリングし、レンダリング結果を表示するためにQQuickItem使用します。QSGSimpleTextureNodeQtQuick は独自の 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;
  }
}

コンテンツを更新するには、Timer をインスタンス化する必要もあります。これは、QQuickItem 内から実行できます。

于 2013-01-04T13:17:10.940 に答える