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

时间:2016-03-16 11:40:35

标签: qt opengl textures

是否可以直接在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"

我收到以下错误“QML图片:无效图像数据”,除了BG_RGB565.dds以外的每种来源类型(并且只有“.dds”扩展名)。

我有以下问题:

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

  2. QT QML支持哪些OpenGL图像类型,以及如何提示Image类只使用QML以某种方式对其源进行编码/压缩?

1 个答案:

答案 0 :(得分:1)

您必须使用QQuickImageProvider自行实现。

将QQuickImageProvider的类型设置为:

QQmlImageProviderBase::Texture

然后从QSGTextureProvider

返回requestTexture(const QString &id, QSize *size, const QSize &requestedSize)

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

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

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