qml实现一个好看的水纹波
时间: 2023-11-05 16:11:55 浏览: 164
实现水波效果
4星 · 用户满意度95%
可以通过使用QML的ShaderEffect来实现一个好看的水纹波效果。下面是一个简单的实现示例:
```
import QtQuick 2.0
ShaderEffect {
property real time: 0.0
property real amplitude: 0.03
property real frequency: 30.0
property real speed: 0.5
fragmentShader: "
uniform lowp sampler2D source;
uniform lowp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
uniform lowp float time;
uniform lowp float amplitude;
uniform lowp float frequency;
uniform lowp float speed;
void main() {
highp vec2 uv = qt_TexCoord0;
highp vec2 p = -1.0 + 2.0 * uv;
highp float len = length(p);
highp vec2 offset = p * sin(len * frequency + time * speed) * amplitude;
gl_FragColor = texture2D(source, uv + offset) * qt_Opacity;
}
"
property alias source: source
source: ShaderEffectSource {
sourceItem: parent
hideSource: true
}
NumberAnimation onTime {
from: 0.0
to: Math.PI * 2.0
duration: 1000
loops: Animation.Infinite
running: true
}
}
```
在这个ShaderEffect中,我们使用了一个时间参数来控制水纹波的运动,以及振幅、频率和速度三个参数来控制水纹波的形状。我们在片段着色器中计算出每个像素的偏移量,然后通过偏移后的坐标来获取纹理颜色值。最后将纹理颜色和透明度相乘得到最终的颜色。
你可以将这个ShaderEffect应用到任何QML元素上,例如一个矩形或者一个图片元素,来实现一个好看的水纹波效果。
阅读全文