PostProcess.glsl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifdef COMPILEPS
  2. const float PI = 3.14159265;
  3. vec2 Noise(vec2 coord)
  4. {
  5. float noiseX = clamp(fract(sin(dot(coord, vec2(12.9898, 78.233))) * 43758.5453), 0.0, 1.0);
  6. float noiseY = clamp(fract(sin(dot(coord, vec2(12.9898, 78.233) * 2.0)) * 43758.5453), 0.0, 1.0);
  7. return vec2(noiseX, noiseY);
  8. }
  9. // Adapted: http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html
  10. vec4 GaussianBlur(int blurKernelSize, vec2 blurDir, vec2 blurRadius, float sigma, sampler2D texSampler, vec2 texCoord)
  11. {
  12. int blurKernelSizeHalfSize = blurKernelSize / 2;
  13. // Incremental Gaussian Coefficent Calculation (See GPU Gems 3 pp. 877 - 889)
  14. vec3 gaussCoeff;
  15. gaussCoeff.x = 1.0 / (sqrt(2.0 * PI) * sigma);
  16. gaussCoeff.y = exp(-0.5 / (sigma * sigma));
  17. gaussCoeff.z = gaussCoeff.y * gaussCoeff.y;
  18. vec2 blurVec = blurRadius * blurDir;
  19. vec4 avgValue = vec4(0.0);
  20. float gaussCoeffSum = 0.0;
  21. avgValue += texture2D(texSampler, texCoord) * gaussCoeff.x;
  22. gaussCoeffSum += gaussCoeff.x;
  23. gaussCoeff.xy *= gaussCoeff.yz;
  24. for (int i = 1; i <= blurKernelSizeHalfSize; i++)
  25. {
  26. avgValue += texture2D(texSampler, texCoord - float(i) * blurVec) * gaussCoeff.x;
  27. avgValue += texture2D(texSampler, texCoord + float(i) * blurVec) * gaussCoeff.x;
  28. gaussCoeffSum += 2.0 * gaussCoeff.x;
  29. gaussCoeff.xy *= gaussCoeff.yz;
  30. }
  31. return avgValue / gaussCoeffSum;
  32. }
  33. const vec3 LumWeights = vec3(0.2126, 0.7152, 0.0722);
  34. vec3 ReinhardEq3Tonemap(vec3 x)
  35. {
  36. return x / (1.0 + x);
  37. }
  38. vec3 ReinhardEq4Tonemap(vec3 x, float white)
  39. {
  40. return x * (1.0 + x / white) / (1.0 + x);
  41. }
  42. // Unchared2 tone mapping (See http://filmicgames.com)
  43. const float A = 0.15;
  44. const float B = 0.50;
  45. const float C = 0.10;
  46. const float D = 0.20;
  47. const float E = 0.02;
  48. const float F = 0.30;
  49. vec3 Uncharted2Tonemap(vec3 x)
  50. {
  51. return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
  52. }
  53. vec3 ColorCorrection(vec3 color, sampler3D lut)
  54. {
  55. float lutSize = 16.0;
  56. float scale = (lutSize - 1.0) / lutSize;
  57. float offset = 1.0 / (2.0 * lutSize);
  58. return texture3D(lut, clamp(color, 0.0, 1.0) * scale + offset).rgb;
  59. }
  60. const float Gamma = 2.2;
  61. const float InverseGamma = 1.0 / 2.2;
  62. vec3 ToGamma(vec3 color)
  63. {
  64. return vec3(pow(color.r, Gamma), pow(color.g, Gamma), pow(color.b, Gamma));
  65. }
  66. vec3 ToInverseGamma(vec3 color)
  67. {
  68. return vec3(pow(color.r, InverseGamma), pow(color.g, InverseGamma), pow(color.b, InverseGamma));
  69. }
  70. #endif