AutoExposure.shader 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. Shader "Hidden/PostProcessing/AutoExposure"
  2. {
  3. HLSLINCLUDE
  4. #pragma target 4.5
  5. #include "../StdLib.hlsl"
  6. #include "ExposureHistogram.hlsl"
  7. TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
  8. float4 _Params; // x: lowPercent, y: highPercent, z: minBrightness, w: maxBrightness
  9. float2 _Speed; // x: down, y: up
  10. float4 _ScaleOffsetRes; // x: scale, y: offset, w: histogram pass width, h: histogram pass height
  11. float _ExposureCompensation;
  12. StructuredBuffer<uint> _HistogramBuffer;
  13. float GetExposureMultiplier(float avgLuminance)
  14. {
  15. avgLuminance = max(EPSILON, avgLuminance);
  16. //float keyValue = 1.03 - (2.0 / (2.0 + log2(avgLuminance + 1.0)));
  17. float keyValue = _ExposureCompensation;
  18. float exposure = keyValue / avgLuminance;
  19. return exposure;
  20. }
  21. float InterpolateExposure(float newExposure, float oldExposure)
  22. {
  23. float delta = newExposure - oldExposure;
  24. float speed = delta > 0.0 ? _Speed.x : _Speed.y;
  25. float exposure = oldExposure + delta * (1.0 - exp2(-unity_DeltaTime.x * speed));
  26. //float exposure = oldExposure + delta * (unity_DeltaTime.x * speed);
  27. return exposure;
  28. }
  29. float4 FragAdaptProgressive(VaryingsDefault i) : SV_Target
  30. {
  31. float maxValue = 1.0 / FindMaxHistogramValue(_HistogramBuffer);
  32. float avgLuminance = GetAverageLuminance(_HistogramBuffer, _Params, maxValue, _ScaleOffsetRes.xy);
  33. float exposure = GetExposureMultiplier(avgLuminance);
  34. float prevExposure = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, (0.5).xx).r; // TODO: Might change for single-pass
  35. exposure = InterpolateExposure(exposure, prevExposure);
  36. return exposure.xxxx;
  37. }
  38. float4 FragAdaptFixed(VaryingsDefault i) : SV_Target
  39. {
  40. float maxValue = 1.0 / FindMaxHistogramValue(_HistogramBuffer);
  41. float avgLuminance = GetAverageLuminance(_HistogramBuffer, _Params, maxValue, _ScaleOffsetRes.xy);
  42. float exposure = GetExposureMultiplier(avgLuminance);
  43. return exposure.xxxx;
  44. }
  45. ENDHLSL
  46. SubShader
  47. {
  48. Cull Off ZWrite Off ZTest Always
  49. Pass
  50. {
  51. HLSLPROGRAM
  52. #pragma vertex VertDefault
  53. #pragma fragment FragAdaptProgressive
  54. ENDHLSL
  55. }
  56. Pass
  57. {
  58. HLSLPROGRAM
  59. #pragma vertex VertDefault
  60. #pragma fragment FragAdaptFixed
  61. ENDHLSL
  62. }
  63. }
  64. }