RGBToHSB.glsl 804 B

123456789101112131415161718192021222324252627
  1. /**
  2. * Converts an RGB color to HSB (hue, saturation, brightness)
  3. * HSB <-> RGB conversion with minimal branching: {@link http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl}
  4. *
  5. * @name czm_RGBToHSB
  6. * @glslFunction
  7. *
  8. * @param {vec3} rgb The color in RGB.
  9. *
  10. * @returns {vec3} The color in HSB.
  11. *
  12. * @example
  13. * vec3 hsb = czm_RGBToHSB(rgb);
  14. * hsb.z *= 0.1;
  15. * rgb = czm_HSBToRGB(hsb);
  16. */
  17. const vec4 K_RGB2HSB = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
  18. vec3 czm_RGBToHSB(vec3 rgb)
  19. {
  20. vec4 p = mix(vec4(rgb.bg, K_RGB2HSB.wz), vec4(rgb.gb, K_RGB2HSB.xy), step(rgb.b, rgb.g));
  21. vec4 q = mix(vec4(p.xyw, rgb.r), vec4(rgb.r, p.yzx), step(p.x, rgb.r));
  22. float d = q.x - min(q.w, q.y);
  23. return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + czm_epsilon7)), d / (q.x + czm_epsilon7), q.x);
  24. }