gain_hsl.frag 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. ** Copyright (c) 2012, Romain Dura romain@shazbits.com
  3. **
  4. ** Permission to use, copy, modify, and/or distribute this software for any
  5. ** purpose with or without fee is hereby granted, provided that the above
  6. ** copyright notice and this permission notice appear in all copies.
  7. **
  8. ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. ** WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. ** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  11. ** SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. ** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. ** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
  14. ** IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /*
  17. ** Hue, saturation, luminance
  18. */
  19. /*
  20. ** 2013 adapted for Extended View Toolkit by Marian Weger
  21. */
  22. #extension GL_ARB_texture_rectangle : enable
  23. uniform sampler2DRect tex0;
  24. uniform vec4 gain;
  25. vec3 RGBToHSL(vec3 color)
  26. {
  27. vec3 hsl; // init to 0 to avoid warnings ? (and reverse if + remove first part)
  28. float fmin = min(min(color.r, color.g), color.b); //Min. value of RGB
  29. float fmax = max(max(color.r, color.g), color.b); //Max. value of RGB
  30. float delta = fmax - fmin; //Delta RGB value
  31. hsl.z = (fmax + fmin) / 2.0; // Luminance
  32. if (delta == 0.0) //This is a gray, no chroma...
  33. {
  34. hsl.x = 0.0; // Hue
  35. hsl.y = 0.0; // Saturation
  36. }
  37. else //Chromatic data...
  38. {
  39. if (hsl.z < 0.5)
  40. hsl.y = delta / (fmax + fmin); // Saturation
  41. else
  42. hsl.y = delta / (2.0 - fmax - fmin); // Saturation
  43. float deltaR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta;
  44. float deltaG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta;
  45. float deltaB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta;
  46. if (color.r == fmax )
  47. hsl.x = deltaB - deltaG; // Hue
  48. else if (color.g == fmax)
  49. hsl.x = (1.0 / 3.0) + deltaR - deltaB; // Hue
  50. else if (color.b == fmax)
  51. hsl.x = (2.0 / 3.0) + deltaG - deltaR; // Hue
  52. if (hsl.x < 0.0)
  53. hsl.x += 1.0; // Hue
  54. else if (hsl.x > 1.0)
  55. hsl.x -= 1.0; // Hue
  56. }
  57. return hsl;
  58. }
  59. float HueToRGB(float f1, float f2, float hue)
  60. {
  61. if (hue < 0.0)
  62. hue += 1.0;
  63. else if (hue > 1.0)
  64. hue -= 1.0;
  65. float res;
  66. if ((6.0 * hue) < 1.0)
  67. res = f1 + (f2 - f1) * 6.0 * hue;
  68. else if ((2.0 * hue) < 1.0)
  69. res = f2;
  70. else if ((3.0 * hue) < 2.0)
  71. res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;
  72. else
  73. res = f1;
  74. return res;
  75. }
  76. vec3 HSLToRGB(vec3 hsl)
  77. {
  78. vec3 rgb;
  79. if (hsl.y == 0.0)
  80. rgb = vec3(hsl.z); // Luminance
  81. else
  82. {
  83. float f2;
  84. if (hsl.z < 0.5)
  85. f2 = hsl.z * (1.0 + hsl.y);
  86. else
  87. f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);
  88. float f1 = 2.0 * hsl.z - f2;
  89. rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));
  90. rgb.g = HueToRGB(f1, f2, hsl.x);
  91. rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));
  92. }
  93. return rgb;
  94. }
  95. void main(void)
  96. {
  97. vec2 pos = (gl_TextureMatrix[0] * gl_TexCoord[0]).st;
  98. vec4 color_old = texture2DRect(tex0, vec2(pos.x, pos.y));
  99. vec4 color_hsl = vec4(RGBToHSL(color_old.rgb), color_old.a);
  100. color_hsl.r = clamp(gain.r * color_hsl.r, 0., 1.);
  101. color_hsl.g = clamp(gain.g * color_hsl.g, 0., 1.);
  102. color_hsl.b = clamp(gain.b * color_hsl.b, 0., 1.);
  103. color_hsl.a = clamp(gain.a * color_hsl.a, 0., 1.);
  104. vec4 color_new = vec4(HSLToRGB(color_hsl.rgb), color_hsl.a);
  105. gl_FragColor = color_new;
  106. }