waves.sksl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. const int POINTS = 5; // Point rows are determined like N / 10, from bottom to up
  2. const float WAVE_OFFSET = 5000.0;
  3. const float SPEED = 0.05;
  4. float mod(float x, float y) {
  5. return x - y * floor(x / y);
  6. }
  7. float smoothstep(float a, float b, float x) {
  8. float t = clamp((x - a) / (b - a), 0.0, 1.0);
  9. return t * t * (3.0 - 2.0 * t);
  10. }
  11. vec3 blendOverlay(vec3 base, vec3 blend) {
  12. return vec3(
  13. base.r < 0.5 ? (2.0 * base.r * blend.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - blend.r)),
  14. base.g < 0.5 ? (2.0 * base.g * blend.g) : (1.0 - 2.0 * (1.0 - base.g) * (1.0 - blend.g)),
  15. base.b < 0.5 ? (2.0 * base.b * blend.b) : (1.0 - 2.0 * (1.0 - base.b) * (1.0 - blend.b))
  16. );
  17. }
  18. void voronoi(vec2 uv, inout vec3 col)
  19. {
  20. vec3 voronoi = vec3(0.0);
  21. float time = (iTime + WAVE_OFFSET)*SPEED;
  22. float bestDistance = 999.0;
  23. float lastBestDistance = bestDistance;
  24. for (int i = 0; i < POINTS; i++)
  25. {
  26. float fi = float(i);
  27. vec2 p = vec2(mod(fi, 1.0) * 0.1 + sin(fi),
  28. -0.05 + 0.15 * float(i / 10) + cos(fi + time * cos(uv.x * 0.025)));
  29. float d = distance(uv, p);
  30. if (d < bestDistance)
  31. {
  32. lastBestDistance = bestDistance;
  33. bestDistance = d;
  34. voronoi.x = p.x;
  35. voronoi.yz = vec2(p.x * 0.4 + p.y, p.y) * vec2(0.9, 0.87);
  36. }
  37. }
  38. col *= 0.68 + 0.19 * voronoi;
  39. col += smoothstep(0.99, 1.05, 1.0 - abs(bestDistance - lastBestDistance)) * 0.9;
  40. col += smoothstep(0.95, 1.01, 1.0 - abs(bestDistance - lastBestDistance)) * 0.1 * col;
  41. col += (voronoi) * 0.1 * smoothstep(0.5, 1.0, 1.0 - abs(bestDistance - lastBestDistance));
  42. }
  43. vec4 main(vec2 fragCoord )
  44. {
  45. vec2 uv = fragCoord/iResolution.xy;
  46. vec3 col = mix(iPrimary, iAccent, uv.x);
  47. voronoi(uv * 4.0 - 1.0, col);
  48. vec3 finalCol = blendOverlay(iBase, col);
  49. return vec4(finalCol, iAlpha);
  50. }