在qt5的qtquick 2.0中渲染自定义opengl

wul*_*eng 14 opengl qt qt-quick qt5

我正在寻找一种方法来在qtquick 2.0项目中呈现我的自定义opengl调用.为了给你一些上下文:我有一个使用opengl进行渲染的C++ 3d引擎.目标是让它在qtquick 2.0 UI中呈现.

我发现的是pre 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?

小智 9

你可以做两件事之一.通过使用QQuickWindow::beforeRenderingQQuickWindow::afterRendering信号挂钩,将内容渲染为纹理或在场景图的OpenGL上下文中渲染.

有关如何使用FBO和纹理的示例,请访问:http://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html

有关如何直接渲染场景图的OpenGL上下文的示例,请访问:http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html


use*_*108 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

您还需要实例化一个 Timer 来更新内容。您可以从 QQuickItem 中执行此操作。