c++ - Qt3D动态贴图

标签 c++ qt qml qt3d

我正在开发包含 Qt3D View 的软件。 这种 3D View 使我们能够可视化元素。对象的所有渲染部分都在 QML 中使用自定义 Material /着色器完成。

我能够创建一种 Material ,将纹理传递给着色器进行纹理化。保存纹理的 QML 对象是 Texture2D(它的 c++ 实现是 QTexture2D )

我的问题是我找不到动态更改纹理内容的方法。 在该软件中,用户可以从光盘加载任何图像。我可以从这个图像正确地创建一个 QImage 实例。

所以问题是: 我在 C++ 中有一个 QImage 实例,我想将它转换为 QTexture2D 实例,以便我可以将它传递给 QML 端。

我该怎么做?

我已经查看了 QAbstractTexture 和 QAbstractTextureImage 类(及其子类),但找不到从 QImage 创建这些类的方法

最佳答案

好吧,经过很长时间,这是我使用的解决方案:

仅在 C++ 中存储包含纹理路径的 QString,并在 QML 中创建所有纹理对象。 QML 看起来像这样:

MyDynamicTextureMaterial { // Custom material passing a Texture2D to the shader
    id: myMaterial

    texture: Texture2D {
        id: myTexture
        minificationFilter: Texture.Linear
        magnificationFilter: Texture.Linear
        wrapMode {
            x: WrapMode.Repeat
            y: WrapMode.Repeat
        }
        maximumAnisotropy: 16.0
        TextureImage {
            id: textureImage
            layer: 0
            mipLevel: 0
            source: cppObjectReference.texturePath ? cppObjectReference.texturePath : ""
        }
    }
}

cppObjectReference 是对我创建的 cpp 对象的引用。这个对象只需要一个具有读取、写入和通知选项的 QString 类型的属性

关于c++ - Qt3D动态贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47161744/

相关文章:

c++ - QPushButton 不遵守水平扩展尺寸策略

python - 从python方法cython访问python类中的c指针

c++ - glInterleavedArrays() 生成 GL_INVALID_FRAMEBUFFER_OPERATION

c++ - qt里面的mysql创建过程(create语句)

c++ - 重新格式化 C++ 代码?

c++ - 如何使用 QSettings 在 Qt 应用程序中加载设置

qml - Qt Quick (QML) 颜色声明

c++ - QQuickFramebufferObject重绘只显示清晰颜色

javascript - Qt Canvas3D 代码中为各种对象设置的那些字符串 "name"属性是什么?

c++ - Qt 5 中的宏 "QT_BEGIN_NAMESPACE"是什么意思?