波浪效果(Wave Effect)

在这个更加复杂的例子中,我们使用片段着色器创建一个波浪效果。波浪的形成是基于sin曲线,并且它影响了使用的纹理坐标的颜色。

  1. import QtQuick 2.0
  2. Rectangle {
  3. width: 480; height: 240
  4. color: '#1e1e1e'
  5. Row {
  6. anchors.centerIn: parent
  7. spacing: 20
  8. Image {
  9. id: sourceImage
  10. width: 160; height: width
  11. source: "assets/coastline.jpg"
  12. }
  13. ShaderEffect {
  14. width: 160; height: width
  15. property variant source: sourceImage
  16. property real frequency: 8
  17. property real amplitude: 0.1
  18. property real time: 0.0
  19. NumberAnimation on time {
  20. from: 0; to: Math.PI*2; duration: 1000; loops: Animation.Infinite
  21. }
  22. fragmentShader: "
  23. varying highp vec2 qt_TexCoord0;
  24. uniform sampler2D source;
  25. uniform lowp float qt_Opacity;
  26. uniform highp float frequency;
  27. uniform highp float amplitude;
  28. uniform highp float time;
  29. void main() {
  30. highp vec2 pulse = sin(time - frequency * qt_TexCoord0);
  31. highp vec2 coord = qt_TexCoord0 + amplitude * vec2(pulse.x, -pulse.x);
  32. gl_FragColor = texture2D(source, coord) * qt_Opacity;
  33. }"
  34. }
  35. }
  36. }

波浪的计算是基于一个脉冲与纹理坐标的操作。我们使用一个基于当前时间与使用的纹理坐标的sin波浪方程式来实现脉冲。

  1. highp vec2 pulse = sin(time - frequency * qt_TexCoord0);

离开了时间的因素,我们仅仅只有扭曲,而不是像波浪一样运动的扭曲。

我们使用不同的纹理坐标作为颜色。

  1. highp vec2 coord = qt_TexCoord0 + amplitude * vec2(pulse.x, -pulse.x);

纹理坐标受我们的x脉冲值影响,结果就像一个移动的波浪。

波浪效果(Wave Effect) - 图1

如果我们没有在片段着色器中使用像素的移动,这个效果可以首先考虑使用顶点着色器来完成。