vec4 RGBtoHSL(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;} float s, l=0.5*(MAX+MIN); if(MAX==MIN){s=0.0;} else if(l<=0.5){s=(MAX-MIN)/(2.0*l);} else {s=(MAX-MIN)/(2.0-2.0*l);} return vec4(h, s, l, o.a); } vec4 HSLtoRGB(in vec4 o) { float q = (o[2]<0.5) ? o[2]*(1.0+o[1]) : o[2]+o[1]-(o[2]*o[1]); float p = 2.0*o[2] - q; float hk = o[0]/360.0; vec4 ret; vec3 t; t.r = hk+1.0/3.0, t.g = hk, t.b = hk-1.0/3.0; for(int i=0; i<3; i++) { if(t[i]<0.0) t[i]+=1.0; if(t[i]>1.0) t[i]-=1.0; if(t[i]<1.0/6.0){ ret[i]=p+((q-p)*6.0*t[i]); } else if(t[i]<0.5){ ret[i]=q; } else if(t[i]<2.0/3.0){ ret[i]=p+((q-p)*6.0*(2.0/3.0-t[i])); } else{ ret[i]=p; } } ret[3] = o[3]; return ret; } in float dh, ds, dl; void main(void) { vec4 hsl = RGBtoHSL(getPix()); hsl[0] = mod(hsl[0]+dh/2.0/PI*360.0, 360.0); hsl[1] = hsl[1]+ds; hsl[2] = hsl[2]+dl; pix(HSLtoRGB(hsl)); }