OSDN Git Service

first
[psychlops/cpp.git] / win32gl / test / shader_sample / HSVrotation.image.glsl.txt
1 vec4 RGBtoHSV(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         h = mod(h, 360.0);\r
10         float v = MAX, s;\r
11         if(MAX==MIN) { s=0.0; } else { s=(MAX-MIN)/MAX; }\r
12         return vec4(h, s, v, o.a);\r
13 }\r
14 \r
15 vec4 HSVtoRGB(in vec4 o) {\r
16         int hi = int(floor(o[0]/60.0));\r
17         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]);\r
18         if(hi==0){ return vec4(o[2],t,p,o[3]); }\r
19         else if(hi==1){ return vec4(q,o[2],p,o[3]); }\r
20         else if(hi==2){ return vec4(p,o[2],t,o[3]); }\r
21         else if(hi==3){ return vec4(p,q,o[2],o[3]); }\r
22         else if(hi==4){ return vec4(t,p,o[2],o[3]); }\r
23         else if(hi==5){ return vec4(o[2],p,q,o[3]); }\r
24 }\r
25 \r
26 in float dh, ds, dv;\r
27 void main(void) {\r
28         vec4 hsv = RGBtoHSV(getPix());\r
29         hsv[0] = mod(hsv[0]+dh/2.0/PI*360.0, 360.0);\r
30         hsv[1] = hsv[1]+ds;\r
31         hsv[2] = hsv[2]+dv;\r
32         pix(HSVtoRGB(hsv));\r
33 }\r