RGBToHSL.glsl 928 B

12345678910111213141516171819202122232425262728293031323334
  1. /**
  2. * Converts an RGB color to HSL (hue, saturation, lightness)
  3. * HSL <-> RGB conversion: {@link http://www.chilliant.com/rgb2hsv.html}
  4. *
  5. * @name czm_RGBToHSL
  6. * @glslFunction
  7. *
  8. * @param {vec3} rgb The color in RGB.
  9. *
  10. * @returns {vec3} The color in HSL.
  11. *
  12. * @example
  13. * vec3 hsl = czm_RGBToHSL(rgb);
  14. * hsl.z *= 0.1;
  15. * rgb = czm_HSLToRGB(hsl);
  16. */
  17. vec3 RGBtoHCV(vec3 rgb)
  18. {
  19. // Based on work by Sam Hocevar and Emil Persson
  20. vec4 p = (rgb.g < rgb.b) ? vec4(rgb.bg, -1.0, 2.0 / 3.0) : vec4(rgb.gb, 0.0, -1.0 / 3.0);
  21. vec4 q = (rgb.r < p.x) ? vec4(p.xyw, rgb.r) : vec4(rgb.r, p.yzx);
  22. float c = q.x - min(q.w, q.y);
  23. float h = abs((q.w - q.y) / (6.0 * c + czm_epsilon7) + q.z);
  24. return vec3(h, c, q.x);
  25. }
  26. vec3 czm_RGBToHSL(vec3 rgb)
  27. {
  28. vec3 hcv = RGBtoHCV(rgb);
  29. float l = hcv.z - hcv.y * 0.5;
  30. float s = hcv.y / (1.0 - abs(l * 2.0 - 1.0) + czm_epsilon7);
  31. return vec3(hcv.x, s, l);
  32. }