Solution

Files changed (2) hide show
  1. lab5-rendertotexture/lab5_main.cpp +6 -0
  2. lab5-rendertotexture/postFx.frag +44 -1
lab5-rendertotexture/lab5_main.cpp CHANGED
@@ -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", &currentEffect, PostProcessingEffect::Mosaic);
609
612
  ImGui::RadioButton("Separable Blur", &currentEffect, PostProcessingEffect::Separable_blur);
610
613
  ImGui::RadioButton("Bloom", &currentEffect, PostProcessingEffect::Bloom);
614
+ ImGui::RadioButton("Hue Shift", &currentEffect, 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
  // ----------------------------------------------------------
lab5-rendertotexture/postFx.frag CHANGED
@@ -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(0.0); // place holder
134
+ fragmentColor = vec4(colorShift(textureRect(frameBufferTexture, gl_FragCoord.xy).rgb), 1);
92
135
  break;
93
136
  }
94
137
  }