AutoExposure.glsl 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "Uniforms.glsl"
  2. #include "Samplers.glsl"
  3. #include "Transform.glsl"
  4. #include "ScreenPos.glsl"
  5. #include "PostProcess.glsl"
  6. varying vec2 vTexCoord;
  7. varying vec2 vScreenPos;
  8. #ifdef COMPILEPS
  9. uniform float cAutoExposureAdaptRate;
  10. uniform vec2 cAutoExposureLumRange;
  11. uniform float cAutoExposureMiddleGrey;
  12. uniform vec2 cHDR128InvSize;
  13. uniform vec2 cLum64InvSize;
  14. uniform vec2 cLum16InvSize;
  15. uniform vec2 cLum4InvSize;
  16. float GatherAvgLum(sampler2D texSampler, vec2 texCoord, vec2 texelSize)
  17. {
  18. float lumAvg = 0.0;
  19. lumAvg += texture2D(texSampler, texCoord + vec2(1.0, -1.0) * texelSize).r;
  20. lumAvg += texture2D(texSampler, texCoord + vec2(-1.0, 1.0) * texelSize).r;
  21. lumAvg += texture2D(texSampler, texCoord + vec2(1.0, 1.0) * texelSize).r;
  22. lumAvg += texture2D(texSampler, texCoord + vec2(1.0, -1.0) * texelSize).r;
  23. return lumAvg / 4.0;
  24. }
  25. #endif
  26. void VS()
  27. {
  28. mat4 modelMatrix = iModelMatrix;
  29. vec3 worldPos = GetWorldPos(modelMatrix);
  30. gl_Position = GetClipPos(worldPos);
  31. vTexCoord = GetQuadTexCoord(gl_Position);
  32. vScreenPos = GetScreenPosPreDiv(gl_Position);
  33. }
  34. void PS()
  35. {
  36. #ifdef LUMINANCE64
  37. float logLumSum = 0.0;
  38. logLumSum += log(dot(texture2D(sDiffMap, vTexCoord + vec2(-1.0, -1.0) * cHDR128InvSize).rgb, LumWeights) + 1e-5);
  39. logLumSum += log(dot(texture2D(sDiffMap, vTexCoord + vec2(-1.0, 1.0) * cHDR128InvSize).rgb, LumWeights) + 1e-5);
  40. logLumSum += log(dot(texture2D(sDiffMap, vTexCoord + vec2(1.0, 1.0) * cHDR128InvSize).rgb, LumWeights) + 1e-5);
  41. logLumSum += log(dot(texture2D(sDiffMap, vTexCoord + vec2(1.0, -1.0) * cHDR128InvSize).rgb, LumWeights) + 1e-5);
  42. gl_FragColor.r = logLumSum;
  43. #endif
  44. #ifdef LUMINANCE16
  45. gl_FragColor.r = GatherAvgLum(sDiffMap, vTexCoord, cLum64InvSize);
  46. #endif
  47. #ifdef LUMINANCE4
  48. gl_FragColor.r = GatherAvgLum(sDiffMap, vTexCoord, cLum16InvSize);
  49. #endif
  50. #ifdef LUMINANCE1
  51. gl_FragColor.r = exp(GatherAvgLum(sDiffMap, vTexCoord, cLum4InvSize) / 16.0);
  52. #endif
  53. #ifdef ADAPTLUMINANCE
  54. float adaptedLum = texture2D(sDiffMap, vTexCoord).r;
  55. float lum = clamp(texture2D(sNormalMap, vTexCoord).r, cAutoExposureLumRange.x, cAutoExposureLumRange.y);
  56. gl_FragColor.r = adaptedLum + (lum - adaptedLum) * (1.0 - exp(-cDeltaTimePS * cAutoExposureAdaptRate));
  57. #endif
  58. #ifdef EXPOSE
  59. vec3 color = texture2D(sDiffMap, vScreenPos).rgb;
  60. float adaptedLum = texture2D(sNormalMap, vTexCoord).r;
  61. gl_FragColor = vec4(color * (cAutoExposureMiddleGrey / adaptedLum), 1.0);
  62. #endif
  63. }