OSDN Git Service

first
[psychlops/cpp.git] / win32gl / test / shader_sample / binarize.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 threshold, r, g, b, a;\r
30 void main(void) {\r
31         vec4 agg;\r
32         for(int x=-2; x<=2; x++) {\r
33                 for(int y=-2; y<=2; y++) {\r
34                         agg += getPixOffset(x, y);\r
35                 }\r
36         }\r
37         agg /= 25.0;\r
38         vec4 hsl = RGBtoHSL(getPix());\r
39         vec4 result;\r
40         if(hsl[2]>threshold) result = vec4(1.0,1.0,1.0,1.0);\r
41         else result = vec4(r, g, b, a);\r
42         pix(result);\r
43 }\r