getWaterNoise.glsl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. /**
  2. * @private
  3. */
  4. vec4 czm_getWaterNoise(sampler2D normalMap, vec2 uv, float time, float angleInRadians)
  5. {
  6. float cosAngle = cos(angleInRadians);
  7. float sinAngle = sin(angleInRadians);
  8. // time dependent sampling directions
  9. vec2 s0 = vec2(1.0/17.0, 0.0);
  10. vec2 s1 = vec2(-1.0/29.0, 0.0);
  11. vec2 s2 = vec2(1.0/101.0, 1.0/59.0);
  12. vec2 s3 = vec2(-1.0/109.0, -1.0/57.0);
  13. // rotate sampling direction by specified angle
  14. s0 = vec2((cosAngle * s0.x) - (sinAngle * s0.y), (sinAngle * s0.x) + (cosAngle * s0.y));
  15. s1 = vec2((cosAngle * s1.x) - (sinAngle * s1.y), (sinAngle * s1.x) + (cosAngle * s1.y));
  16. s2 = vec2((cosAngle * s2.x) - (sinAngle * s2.y), (sinAngle * s2.x) + (cosAngle * s2.y));
  17. s3 = vec2((cosAngle * s3.x) - (sinAngle * s3.y), (sinAngle * s3.x) + (cosAngle * s3.y));
  18. vec2 uv0 = (uv/103.0) + (time * s0);
  19. vec2 uv1 = uv/107.0 + (time * s1) + vec2(0.23);
  20. vec2 uv2 = uv/vec2(897.0, 983.0) + (time * s2) + vec2(0.51);
  21. vec2 uv3 = uv/vec2(991.0, 877.0) + (time * s3) + vec2(0.71);
  22. uv0 = fract(uv0);
  23. uv1 = fract(uv1);
  24. uv2 = fract(uv2);
  25. uv3 = fract(uv3);
  26. vec4 noise = (texture(normalMap, uv0)) +
  27. (texture(normalMap, uv1)) +
  28. (texture(normalMap, uv2)) +
  29. (texture(normalMap, uv3));
  30. // average and scale to between -1 and 1
  31. return ((noise / 4.0) - 0.5) * 2.0;
  32. }