OSDN Git Service

first
[psychlops/cpp.git] / win32gl / test / shader_sample / HSLrotation.image.glsl.txt
1 vec4 RGBtoHSL(in vec4 o) {\r
2         float MAX = max(max(o.r, o.g), o.b);\r
3         float MIN = min(min(o.r, o.g), o.b);\r
4         float h;\r
5         if(MAX==MIN) { h=0.0; }\r
6         else if(o.r>o.g && o.r>o.b){h=60.0*(o.g-o.b)/(MAX-MIN)+360.0;}\r
7         else if(o.g>o.b){h=60.0*(o.b-o.r)/(MAX-MIN)+120.0;}\r
8         else {h=60.0*(o.r-o.g)/(MAX-MIN)+240.0;}\r
9         float s, l=0.5*(MAX+MIN);\r
10         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);}\r
11         return vec4(h, s, l, o.a);\r
12 }\r
13 vec4 HSLtoRGB(in vec4 o) {\r
14         float q = (o[2]<0.5) ? o[2]*(1.0+o[1]) : o[2]+o[1]-(o[2]*o[1]);\r
15         float p = 2.0*o[2] - q;\r
16         float hk = o[0]/360.0;\r
17         vec4 ret; vec3 t; t.r = hk+1.0/3.0, t.g = hk, t.b = hk-1.0/3.0;\r
18         for(int i=0; i<3; i++) {\r
19                 if(t[i]<0.0) t[i]+=1.0; if(t[i]>1.0) t[i]-=1.0;\r
20                 if(t[i]<1.0/6.0){ ret[i]=p+((q-p)*6.0*t[i]); }\r
21                 else if(t[i]<0.5){ ret[i]=q; }\r
22                 else if(t[i]<2.0/3.0){ ret[i]=p+((q-p)*6.0*(2.0/3.0-t[i])); }\r
23                 else{ ret[i]=p; }\r
24         }\r
25         ret[3] = o[3];\r
26         return ret;\r
27 }\r
28 \r
29 in float dh, ds, dl;\r
30 void main(void) {\r
31         vec4 hsl = RGBtoHSL(getPix());\r
32         hsl[0] = mod(hsl[0]+dh/2.0/PI*360.0, 360.0);\r
33         hsl[1] = hsl[1]+ds;\r
34         hsl[2] = hsl[2]+dl;\r
35         pix(HSLtoRGB(hsl));\r
36 }\r