我正在寻找一种在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吗?
答案 0 :(得分:9)
你可以做两件事之一。通过使用QQuickWindow::beforeRendering
或QQuickWindow::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
答案 1 :(得分:3)
在3D引擎中,渲染为纹理,并在QQuickItem
使用QSGSimpleTextureNode
中显示渲染结果。 QtQuick维持它自己的GL状态,否则你可能会搞砸,这就是为什么建议只使用QSG *类来显示自定义内容。基本上,普通的QtQuick是一种用于渲染矩形的工具,而不是一般的3D内容。
(Lame)例子:
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中执行此操作。