如何在 QML 中使用压缩/编码纹理?

How to use compressed / encoded textures in QML?

是否可以直接在 qml 中将压缩纹理的数据发送到 QImage?

现在我有以下代码:

Image 
{
  anchors.fill: parent
  fillMode : Image.Stretch
  source : "Textures/BG_png.png"
}

然后,我创建具有各种格式来源的图像,更准确地说:

// uncompressed
source : "Textures/BG_RGB565.dds"
source : "Textures/BG_RGB888.dds"
source : "Textures/BG_RGBA8888.dds"

//compressed
source : "Textures/BG_ETC1.ktx"
source : "Textures/BG_ETC1.pkm"
source : "Textures/BG_ETC1.dds"
source : "Textures/BG_PVR.pvr"
source : "Textures/BG_ASTC.astc"

对于除 BG_RGB565.dds 之外的所有源类型(并且仅具有“.dds”扩展名),我都收到以下错误 "QML Image : invalid image data"。

我有以下问题:

  1. 为什么 RGB565.dds 可以工作而 RGB888 或其他未压缩格式不能?

  2. QT QML 支持哪些 OpenGL 图像类型,您如何提示图像 class 它的源仅使用 QML 以某种方式编码/压缩?

您必须使用 QQuickImageProvider 自行实现。

将 QQuickImageProvider 的类型设置为:

QQmlImageProviderBase::Texture

然后 return 来自 requestTexture(const QString &id, QSize *size, const QSize &requestedSize)

QSGTextureProvider

在此处查看更多详细信息: https://doc.qt.io/qt-5/qquickimageprovider.html

目前 Image{} 支持的唯一格式是: https://doc.qt.io/qt-5/qtimageformats-index.html

也许可以从 Qt3D 加载它,但我不确定是否支持这些格式。