C++ 使用C++;

C++ 使用C++;,c++,3d,qt5,qt3d,C++,3d,Qt5,Qt3d,我试图在Scene3D场景中的长方体或平面上渲染QML组件。我已经成功地遵循了文档中的例子,但是我试图把它转换成C++ API,因为我需要做更多的事情,只有C++才足够。这是我的类的ctor,它根据示例代码设置实体及其组件。为了简洁起见,我只加入了ctor。班上没有其他任何东西会影响这一点 ESEctoPointToast::ESEctoPointToast(Qt3DCore::QNode *parent) : Qt3DCore::QEntity(parent) , m_position

我试图在
Scene3D
场景中的长方体或平面上渲染QML组件。我已经成功地遵循了文档中的例子,但是我试图把它转换成C++ API,因为我需要做更多的事情,只有C++才足够。这是我的类的ctor,它根据示例代码设置实体及其组件。为了简洁起见,我只加入了ctor。班上没有其他任何东西会影响这一点

ESEctoPointToast::ESEctoPointToast(Qt3DCore::QNode *parent)
:   Qt3DCore::QEntity(parent)
,   m_position(QVector3D(0,0,0))
,   m_quickItem(nullptr)
,   m_cuboid(new Qt3DExtras::QCuboidMesh())
,   m_textureMaterial(new Qt3DExtras::QTextureMaterial())
,   m_transform(new Qt3DCore::QTransform())
,   m_objectPicker(new Qt3DRender::QObjectPicker())
,   m_texture2d(new Qt3DRender::QTexture2D())
,   m_renderTargetOutput(new Qt3DRender::QRenderTargetOutput())
,   m_scene2d(new Qt3DRender::Quick::QScene2D())
{
    // g_RootQmlObject is the root item in the main scene, this was the only
    // way I could come up with to access qmlEngine. Is there a better way?
    auto engine = qmlEngine(g_RootQmlObject);
    QQmlComponent c(engine, QUrl("qrc:/components/E3DDummy.qml"));
    m_quickItem = qobject_cast<QQuickItem*>(c.create());
    Q_ASSERT(m_quickItem);

    m_texture2d->setWidth(256);
    m_texture2d->setHeight(256);
    m_texture2d->setFormat(Qt3DRender::QAbstractTexture::TextureFormat::RGB8_UNorm);
    m_texture2d->setGenerateMipMaps(true);
    m_texture2d->setMagnificationFilter(Qt3DRender::QAbstractTexture::Filter::Linear);
    m_texture2d->setMinificationFilter(Qt3DRender::QAbstractTexture::Filter::LinearMipMapLinear);
    m_texture2d->setWrapMode(Qt3DRender::QTextureWrapMode(Qt3DRender::QTextureWrapMode::ClampToEdge));
    m_renderTargetOutput->setAttachmentPoint(Qt3DRender::QRenderTargetOutput::AttachmentPoint::Color0);
    m_renderTargetOutput->setTexture(m_texture2d);
    m_textureMaterial->setTexture(m_texture2d);
    m_scene2d->setItem(m_quickItem);
    m_scene2d->setMouseEnabled(true);
    m_scene2d->setRenderPolicy(Qt3DRender::Quick::QScene2D::RenderPolicy::Continuous);
    m_scene2d->setOutput(m_renderTargetOutput);
    m_scene2d->addEntity(this);

    addComponent(m_transform);
    addComponent(m_textureMaterial);
    addComponent(m_cuboid);
    addComponent(m_objectPicker);
}
ESEctoPointToast::ESEctoPointToast(Qt3DCore::QNode*parent)
:Qt3DCore::QEntity(父级)
,m_位置(QVector3D(0,0,0))
,m_quickItem(nullptr)
,m_长方体(新的Qt3DExtras::QCuboidMesh())
,m_textureMaterial(新的Qt3DExtras::QTextureMaterial())
,m_变换(新的Qt3DCore::QTransform())
,m_objectPicker(新的Qt3DRender::QObjectPicker())
,m_texture2d(新的Qt3DRender::QTexture2D())
,m_renderTargetOutput(新的Qt3DRender::QRenderTargetOutput())
,m_scene2d(新的Qt3DRender::Quick::QScene2D())
{
//g_RootQmlObject是主场景中的根项目,这是唯一
//我能想出一个方法来访问qmlEngine。有更好的方法吗?
自动引擎=qmlEngine(g_RootQmlObject);
QQmlComponent c(引擎,qrl(“qrc:/components/e3ddumy.qml”);
m_quickItem=qobject_cast(c.create());
Q_断言(m_quickItem);
m_texture2d->setWidth(256);
m_texture2d->设置高度(256);
m_texture2d->setFormat(Qt3DRender::QAbstractTexture::TextureFormat::RGB8_UNorm);
m_texture2d->setGenerateMipMaps(真);
m_texture2d->set放大过滤器(Qt3DRender::QAbstractTexture::Filter::Linear);
m_texture2d->setMinificationFilter(Qt3DRender::QAbstractTexture::Filter::LinearMipmApplinear);
m_texture2d->setWrapMode(Qt3DRender::QTextureWrapMode(Qt3DRender::QTextureWrapMode::clamptodege));
m_renderTargetOutput->setAttachmentPoint(Qt3DRender::QRenderTargetOutput::AttachmentPoint::Color0);
m_renderTargetOutput->setTexture(m_texture2d);
m_textureMaterial->setTexture(m_texture2d);
m_scene2d->setItem(m_quickItem);
m_scene2d->setMouseEnabled(true);
m_scene2d->setRenderPolicy(Qt3DRender::Quick::QScene2D::RenderPolicy::Continuous);
m_scene2d->setOutput(m_renderTargetOutput);
m_scene2d->addEntity(本);
addComponent(m_变换);
添加组件(m_纹理材料);
addComponent(m_长方体);
addComponent(m_objectPicker);
}
我把它包括在另一个类的Scene3D中,它呈现为一个黑匣子,脸上挤满了毫无意义的红色文本。显然这是不对的。我哪里出错了

这就是渲染的内容:

这是由Qt 5.9.x中存在的错误引起的。目前没有可行的解决方案。显然,在平面上渲染QML在5.9.x中被破坏


更新:QT报告该错误在5.11.1中不再存在

g_RootQmlObject是现有运行的QQmlEngine的一部分吗?如果没有,您可能希望启动一个新的QQmlEngine。请参见此处“详细描述”下的示例:是,g_RootQmlObject正在运行。不过,我会尝试启动一个新的QQmlEngine以防万一。不幸的是,不会。创建一个新的QQmlEngine会产生相同的结果。随机纹理可能是GPU内存中刚刚保留的其他数据。我不知道为什么在您的情况下失败,但这通常是目标纹理或渲染目标输出中的某些错误设置的症状。我将仔细检查QML示例中设置的所有属性,并验证您在C++代码中的操作完全相同。