opengl_fragment.glsl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #define rendered texture0
  2. #define bloom texture1
  3. struct ExposureParams {
  4. float compensationFactor;
  5. };
  6. uniform sampler2D rendered;
  7. uniform sampler2D bloom;
  8. uniform ExposureParams exposureParams;
  9. uniform lowp float bloomIntensity;
  10. uniform lowp float saturation;
  11. #ifdef GL_ES
  12. varying mediump vec2 varTexCoord;
  13. #else
  14. centroid varying vec2 varTexCoord;
  15. #endif
  16. varying float exposure;
  17. #ifdef ENABLE_BLOOM
  18. vec4 applyBloom(vec4 color, vec2 uv)
  19. {
  20. vec3 light = texture2D(bloom, uv).rgb;
  21. #ifdef ENABLE_BLOOM_DEBUG
  22. if (uv.x > 0.5 && uv.y < 0.5)
  23. return vec4(light, color.a);
  24. if (uv.x < 0.5)
  25. return color;
  26. #endif
  27. color.rgb = mix(color.rgb, light, bloomIntensity);
  28. return color;
  29. }
  30. #endif
  31. #if ENABLE_TONE_MAPPING
  32. /* Hable's UC2 Tone mapping parameters
  33. A = 0.22;
  34. B = 0.30;
  35. C = 0.10;
  36. D = 0.20;
  37. E = 0.01;
  38. F = 0.30;
  39. W = 11.2;
  40. equation used: ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F
  41. */
  42. vec3 uncharted2Tonemap(vec3 x)
  43. {
  44. return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333;
  45. }
  46. vec4 applyToneMapping(vec4 color)
  47. {
  48. const float exposureBias = 2.0;
  49. color.rgb = uncharted2Tonemap(exposureBias * color.rgb);
  50. // Precalculated white_scale from
  51. //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W));
  52. vec3 whiteScale = vec3(1.036015346);
  53. color.rgb *= whiteScale;
  54. return color;
  55. }
  56. vec3 applySaturation(vec3 color, float factor)
  57. {
  58. // Calculate the perceived luminosity from the RGB color.
  59. // See also: https://www.w3.org/WAI/GL/wiki/Relative_luminance
  60. float brightness = dot(color, vec3(0.2125, 0.7154, 0.0721));
  61. return mix(vec3(brightness), color, factor);
  62. }
  63. #endif
  64. void main(void)
  65. {
  66. vec2 uv = varTexCoord.st;
  67. vec4 color = texture2D(rendered, uv).rgba;
  68. // translate to linear colorspace (approximate)
  69. color.rgb = pow(color.rgb, vec3(2.2));
  70. #ifdef ENABLE_BLOOM_DEBUG
  71. if (uv.x > 0.5 || uv.y > 0.5)
  72. #endif
  73. {
  74. color.rgb *= exposure * exposureParams.compensationFactor;
  75. }
  76. #ifdef ENABLE_BLOOM
  77. color = applyBloom(color, uv);
  78. #endif
  79. #ifdef ENABLE_BLOOM_DEBUG
  80. if (uv.x > 0.5 || uv.y > 0.5)
  81. #endif
  82. {
  83. #if ENABLE_TONE_MAPPING
  84. color = applyToneMapping(color);
  85. color.rgb = applySaturation(color.rgb, saturation);
  86. #endif
  87. }
  88. color.rgb = clamp(color.rgb, vec3(0.), vec3(1.));
  89. // return to sRGB colorspace (approximate)
  90. color.rgb = pow(color.rgb, vec3(1.0 / 2.2));
  91. gl_FragColor = vec4(color.rgb, 1.0); // force full alpha to avoid holes in the image.
  92. }