Qt3D动态纹理

时间:2017-11-07 15:34:57

标签: c++ qt qml qt3d

我正在开发包含Qt3D视图的软件。 这个3D视图允许我们可视化元素。对象的所有渲染部分都是使用自定义材质/着色器在QML中完成的。

我能够创建一种材质,将纹理传递到着色器以进行纹理处理。保存纹理的QML对象是Texture2D(它的c ++实现是QTexture2D

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

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

我该怎么做?

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

1 个答案:

答案 0 :(得分:1)

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

仅在c ++中存储包含纹理路径的QString,并在QML中创建所有Texture对象。 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对象的引用。该对象只需要一个带有Read,Write和Notify选项的QString类型的属性