@@ -89,12 +89,14 @@ enum PostProcessingEffect
|
|
89
89
|
Mosaic = 6,
|
90
90
|
Separable_blur = 7,
|
91
91
|
Bloom = 8,
|
92
|
+
HueShift = 9
|
92
93
|
};
|
93
94
|
|
94
95
|
int currentEffect = PostProcessingEffect::None;
|
95
96
|
int filterSize = 1;
|
96
97
|
int filterSizes[12] = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };
|
97
98
|
|
99
|
+
float hueShift = 0;
|
98
100
|
|
99
101
|
///////////////////////////////////////////////////////////////////////////////
|
100
102
|
// Framebuffers
|
@@ -472,6 +474,7 @@ void display()
|
|
472
474
|
labhelper::setUniformSlow(postFxShader, "currentEffect", currentEffect);
|
473
475
|
labhelper::setUniformSlow(postFxShader, "filterSize", filterSizes[filterSize - 1]);
|
474
476
|
|
477
|
+
labhelper::setUniformSlow(postFxShader, "hue_shift", hueShift);
|
475
478
|
|
476
479
|
glActiveTexture(GL_TEXTURE0);
|
477
480
|
glBindTexture(GL_TEXTURE_2D, cameraFB.colorTextureTarget);
|
@@ -608,6 +611,9 @@ void gui()
|
|
608
611
|
ImGui::RadioButton("Mosaic", ¤tEffect, PostProcessingEffect::Mosaic);
|
609
612
|
ImGui::RadioButton("Separable Blur", ¤tEffect, PostProcessingEffect::Separable_blur);
|
610
613
|
ImGui::RadioButton("Bloom", ¤tEffect, PostProcessingEffect::Bloom);
|
614
|
+
ImGui::RadioButton("Hue Shift", ¤tEffect, PostProcessingEffect::HueShift);
|
615
|
+
ImGui::SameLine();
|
616
|
+
ImGui::SliderFloat("Amount##Hue Shift", &hueShift, 0, 1);
|
611
617
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate,
|
612
618
|
ImGui::GetIO().Framerate);
|
613
619
|
// ----------------------------------------------------------
|
@@ -53,6 +53,49 @@ vec2 mosaic(vec2 inCoord)
|
|
53
53
|
return inCoord - mod(inCoord, 22.0);
|
54
54
|
}
|
55
55
|
|
56
|
+
uniform float hue_shift = 0.0;
|
57
|
+
vec3 rgb2hsv(vec3 c)
|
58
|
+
{
|
59
|
+
float V = max(max(c.r, c.g), c.b);
|
60
|
+
float C = V - min(min(c.r, c.g), c.b);
|
61
|
+
float S = 0;
|
62
|
+
if ( V > 0 )
|
63
|
+
{
|
64
|
+
S = C / V;
|
65
|
+
}
|
66
|
+
|
67
|
+
float H = 0;
|
68
|
+
if (C != 0)
|
69
|
+
{
|
70
|
+
if (c.r == V) H = ((c.g - c.b)/C) / 6.0;
|
71
|
+
else if (c.g == V) H = (2 + (c.b - c.r)/C) / 6.0;
|
72
|
+
else H = (4 + (c.r - c.g)/C) / 6.0;
|
73
|
+
H = fract(H);
|
74
|
+
}
|
75
|
+
return vec3(H, S, V);
|
76
|
+
}
|
77
|
+
|
78
|
+
vec3 hsv2rgb(vec3 c)
|
79
|
+
{
|
80
|
+
float C = c.y * c.z;
|
81
|
+
float X = C * (1 - abs(mod(c.x * 6, 2.0) - 1));
|
82
|
+
float m = c.z - C;
|
83
|
+
if (c.x < 1/6.0) c = vec3(C, X, 0);
|
84
|
+
else if (c.x < 2/6.0) c = vec3(X, C, 0);
|
85
|
+
else if (c.x < 3/6.0) c = vec3(0, C, X);
|
86
|
+
else if (c.x < 4/6.0) c = vec3(0, X, C);
|
87
|
+
else if (c.x < 5/6.0) c = vec3(X, 0, C);
|
88
|
+
else c = vec3(C, 0, X);
|
89
|
+
|
90
|
+
return c + m;
|
91
|
+
}
|
92
|
+
|
93
|
+
vec3 colorShift(vec3 c)
|
94
|
+
{
|
95
|
+
c = rgb2hsv(c);
|
96
|
+
c.x = fract(c.x + hue_shift);
|
97
|
+
return hsv2rgb(c);
|
98
|
+
}
|
56
99
|
|
57
100
|
void main()
|
58
101
|
{
|
@@ -88,7 +131,7 @@ void main()
|
|
88
131
|
+ textureRect(blurredFrameBufferTexture, gl_FragCoord.xy);
|
89
132
|
break;
|
90
133
|
case 9:
|
91
|
-
fragmentColor = vec4(
|
134
|
+
fragmentColor = vec4(colorShift(textureRect(frameBufferTexture, gl_FragCoord.xy).rgb), 1);
|
92
135
|
break;
|
93
136
|
}
|
94
137
|
}
|