Qt Quick 示例 - 着色器效果#

../_images/qml-shadereffects-example.png

一个Qt Quick示例,展示如何使用着色器效果。

本例演示了几个使用着色器在Qt Quick中可以实现的视觉效果。它在一个文本和几个图像上应用了五种不同的效果。更多信息,请访问 Qt Quick 重要概念 - 图形效果

运行示例#

要从Qt Creator中运行示例,打开欢迎模式并从示例中选择。更多信息,请访问构建和运行示例。

使用ShaderEffect#

ShaderEffect类型通常在其它类型上操作,使用一个 ShaderEffectSource

ShaderEffectSource {
    id: theSource
    sourceItem: theItem
}

在上面的代码示例中,theItem 是文件中一个复杂的 QML 对象的 ID。

ShaderEffects 可以将此 ShaderEffectSource 作为片段着色器中的纹理使用

fragmentShader: "content/shaders/wobble.frag.qsb"

为了支持多种图形 API,而不仅仅是 OpenGL,着色器源代码不内嵌于 QML 中。引用的 .qsb 文件是一个包含多个着色器代码变体的预生成着色器包。Qt Quick 根据运行时的图形 API(Vulkan、Metal、Direct3D 11 或 OpenGL)选择合适的着色器。.qsb 文件是离线生成的,并通过 Qt 资源系统与可执行文件捆绑在一起。

您可以在着色器中为 ShaderEffect 使用任何自定义属性。这使得动画着色器代码变得非常容易

property variant source: theSource
property real bend
property real minimize
property real side: genieSlider.value
SequentialAnimation on bend {
    loops: Animation.Infinite
    NumberAnimation { to: 1; duration: 700; easing.type: Easing.InOutSine }
    PauseAnimation { duration: 1600 }
    NumberAnimation { to: 0; duration: 700; easing.type: Easing.InOutSine }
    PauseAnimation { duration: 1000 }
}
SequentialAnimation on minimize {
    loops: Animation.Infinite
    PauseAnimation { duration: 300 }
    NumberAnimation { to: 1; duration: 700; easing.type: Easing.InOutSine }
    PauseAnimation { duration: 1000 }
    NumberAnimation { to: 0; duration: 700; easing.type: Easing.InOutSine }
    PauseAnimation { duration: 1300 }
}

ShaderEffects 还可以有自定义的顶点着色器。在 ShaderEffect 上设置网格属性提供了更多可以操作的顶点,从而可以实现更多效果。

mesh: Qt.size(10, 10)
vertexShader: "content/shaders/genie.vert.qsb"

示例项目 @ code.qt.io