我正在使用 QQuickImageProvider 将 3d 扫描仪图像从 C++ 传递到 QML,然后将这些图像用作模型的客户纹理(在此处使用 qt quick 3d)。我遇到了纹理闪烁变黑的问题。它经常重复。我曾经将流图像作为 VideoOutput 进行调查,但这种方法不适合我,因为我必须使用表面的几何数据,并且在 VideoOutput 的情况下,它不允许将这些图像映射到几何坐标上。你能在这种情况下给点建议吗?下面是我的代码示例。
质量管理体系:
Image {
id: textureImage
source: renderControl.sourceUrl
anchors.fill: parent
visible: false // tried with cache true and false both
}
Node {
id: mainScene
DirectionalLight {
position: Qt.vector3d(-500, 500, -100)
ambientColor: Qt.rgba(1.0, 1.0, 1.0, 0.5)
}
Model {
id: viewModel
position: Qt.vector3d(0, 50, 0)
visible: true
scale: Qt.vector3d(10, 11, 4)
geometry: RenderData{ // C++ class which sends url to image provider
id: renderControl
objectName: "geometryData"
}
DefaultMaterial {
id: defaultMaterial
Texture {
id: baseColorMap
sourceItem: textureImage
}
cullMode: DefaultMaterial.NoCulling
diffuseMap: baseColorMap
}
materials: [
defaultMaterial
]
}
C++
。H
class TextureImageProvider : public QObject, public QQuickImageProvider
{
QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize) override;
Q_SIGNALS:
void imageUpdated(const QUrl& imageUrl);
std::shared_ptr<QImage> textureImage_;
}
class RenderData : public QQuick3DGeometry
{
Q_OBJECT
Q_PROPERTY(QUrl sourceUrl READ sourceUrl WRITE setSourceUrl NOTIFY sourceUrlChanged)
TextureImageProvider* imageProvider_;
}
.cpp
void RenderData::updateData(QImage& textureImage)
{
const QUrl imageUrl = QString("image://texture_image_provider/%1").arg(Uuid::createUuid().toString().c_str());
textureImage_ = std::make_shared<QImage>(image);
Q_EMIT imageUpdated(url);
}
QImage TextureImageProvider::requestImage(const QString& id, QSize* size, const QSize& requestedSize)
{
return *textureImage_;
}
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
{
engine_->addImageProvider("texture_image_provider", &renderData_-getImageProvider());
}