-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhsv.glsl
71 lines (63 loc) · 1.57 KB
/
hsv.glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
float
minChannel(in vec3 v)
{
float t = (v.x<v.y) ? v.x : v.y;
t = (t<v.z) ? t : v.z;
return t;
}
float
maxChannel(in vec3 v)
{
float t = (v.x>v.y) ? v.x : v.y;
t = (t>v.z) ? t : v.z;
return t;
}
vec3
rgbToHsv(in vec3 rgb)
{
vec3 hsv = vec3(0.0);
float minVal = minChannel(rgb);
float maxVal = maxChannel(rgb);
float delta = maxVal - minVal;
hsv.z = maxVal;
if (delta != 0.0) {
hsv.y = delta / maxVal;
vec3 delRGB;
delRGB = (((vec3(maxVal) - rgb) / 6.0) + (delta/2.0)) / delta;
if (rgb.x == maxVal) {
hsv.x = delRGB.z - delRGB.y;
} else if (rgb.y == maxVal) {
hsv.x = ( 1.0/3.0) + delRGB.x - delRGB.z;
} else if (rgb.z == maxVal) {
hsv.x = ( 2.0/3.0) + delRGB.y - delRGB.x;
}
if ( hsv.x < 0.0 ) {
hsv.x += 1.0;
}
if ( hsv.x > 1.0 ) {
hsv.x -= 1.0;
}
}
return hsv;
}
vec3
hsvToRgb(in vec3 hsv)
{
vec3 rgb = vec3(hsv.z);
if ( hsv.y != 0.0 ) {
float var_h = hsv.x * 6.0;
float var_i = floor(var_h); // Or ... var_i = floor( var_h )
float var_1 = hsv.z * (1.0 - hsv.y);
float var_2 = hsv.z * (1.0 - hsv.y * (var_h-var_i));
float var_3 = hsv.z * (1.0 - hsv.y * (1.0 - (var_h-var_i)));
switch (int(var_i)) {
case 0: rgb = vec3(hsv.z, var_3, var_1); break;
case 1: rgb = vec3(var_2, hsv.z, var_1); break;
case 2: rgb = vec3(var_1, hsv.z, var_3); break;
case 3: rgb = vec3(var_1, var_2, hsv.z); break;
case 4: rgb = vec3(var_3, var_1, hsv.z); break;
default: rgb = vec3(hsv.z, var_1, var_2); break;
}
}
return rgb;
}