vec3 rgb2hsv(vec3 rgb) { float Cmax = max(rgb.r, max(rgb.g, rgb.b)); float Cmin = min(rgb.r, min(rgb.g, rgb.b)); float delta = Cmax - Cmin; vec3 hsv = vec3(0., 0., Cmax); if (Cmax > Cmin) { hsv.y = delta / Cmax; if (rgb.r == Cmax) hsv.x = (rgb.g - rgb.b) / delta; else { if (rgb.g == Cmax) hsv.x = 2. + (rgb.b - rgb.r) / delta; else hsv.x = 4. + (rgb.r - rgb.g) / delta; } hsv.x = fract(hsv.x / 6.); } return hsv; }