vec4 RGBtoHSV(in vec4 o) { float MAX = max(max(o.r, o.g), o.b); float MIN = min(min(o.r, o.g), o.b); float h; if(MAX==MIN) { h=0.0; } else if(o.r>o.g && o.r>o.b) { h=60.0*(o.g-o.b)/(MAX-MIN)+360.0; } else if(o.g>o.b) { h=60.0*(o.b-o.r)/(MAX-MIN)+120.0; } else { h=60.0*(o.r-o.g)/(MAX-MIN)+240.0; } h = mod(h, 360.0); float v = MAX, s; if(MAX==MIN) { s=0.0; } else { s=(MAX-MIN)/MAX; } return vec4(h, s, v, o.a); } vec4 HSVtoRGB(in vec4 o) { int hi = int(floor(o[0]/60.0)); float f = (o[0]/60.0)-float(hi), p = o[2]*(1.0-o[1]), q = o[2]*(1.0-f*o[1]), t = o[2]*(1.0-(1.0-f)*o[1]); if(hi==0){ return vec4(o[2],t,p,o[3]); } else if(hi==1){ return vec4(q,o[2],p,o[3]); } else if(hi==2){ return vec4(p,o[2],t,o[3]); } else if(hi==3){ return vec4(p,q,o[2],o[3]); } else if(hi==4){ return vec4(t,p,o[2],o[3]); } else if(hi==5){ return vec4(o[2],p,q,o[3]); } } in float dh, ds, dv; void main(void) { vec4 hsv = RGBtoHSV(getPix()); hsv[0] = mod(hsv[0]+dh/2.0/PI*360.0, 360.0); hsv[1] = hsv[1]+ds; hsv[2] = hsv[2]+dv; pix(HSVtoRGB(hsv)); }