LightMeter.shader 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. Shader "Hidden/PostProcessing/Debug/LightMeter"
  2. {
  3. HLSLINCLUDE
  4. #pragma exclude_renderers gles gles3 d3d11_9x
  5. #pragma target 4.5
  6. #include "../StdLib.hlsl"
  7. #include "../Builtins/ExposureHistogram.hlsl"
  8. #pragma multi_compile __ COLOR_GRADING_HDR
  9. #pragma multi_compile __ AUTO_EXPOSURE
  10. float4 _Params; // x: lowPercent, y: highPercent, z: minBrightness, w: maxBrightness
  11. float4 _ScaleOffsetRes; // x: scale, y: offset, w: histogram pass width, h: histogram pass height
  12. TEXTURE3D_SAMPLER3D(_Lut3D, sampler_Lut3D);
  13. StructuredBuffer<uint> _HistogramBuffer;
  14. struct VaryingsLightMeter
  15. {
  16. float4 vertex : SV_POSITION;
  17. float2 texcoord : TEXCOORD0;
  18. float maxValue : TEXCOORD1;
  19. float avgLuminance : TEXCOORD2;
  20. };
  21. VaryingsLightMeter Vert(AttributesDefault v)
  22. {
  23. VaryingsLightMeter o;
  24. o.vertex = float4(v.vertex.xy, 0.0, 1.0);
  25. o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
  26. #if UNITY_UV_STARTS_AT_TOP
  27. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  28. #endif
  29. o.maxValue = 1.0 / FindMaxHistogramValue(_HistogramBuffer);
  30. o.avgLuminance = GetAverageLuminance(_HistogramBuffer, _Params, o.maxValue, _ScaleOffsetRes.xy);
  31. return o;
  32. }
  33. float4 Frag(VaryingsLightMeter i) : SV_Target
  34. {
  35. uint ix = (uint)(round(i.texcoord.x * HISTOGRAM_BINS));
  36. float bin = saturate(float(_HistogramBuffer[ix]) * i.maxValue);
  37. float fill = step(i.texcoord.y, bin);
  38. float4 color = float4(lerp(0.0, 0.75, fill).xxx, 1.0);
  39. #if AUTO_EXPOSURE
  40. const float3 kRangeColor = float3(0.05, 0.3, 0.4);
  41. const float3 kAvgColor = float3(0.75, 0.1, 1.0);
  42. // Min / max brightness markers
  43. float luminanceMin = GetHistogramBinFromLuminance(_Params.z, _ScaleOffsetRes.xy);
  44. float luminanceMax = GetHistogramBinFromLuminance(_Params.w, _ScaleOffsetRes.xy);
  45. if (i.texcoord.x > luminanceMin && i.texcoord.x < luminanceMax)
  46. {
  47. color.rgb = fill.rrr * kRangeColor;
  48. color.rgb += kRangeColor;
  49. }
  50. #endif
  51. #if COLOR_GRADING_HDR
  52. // Draw color curves on top
  53. float4 curves = 0.0;
  54. float3 lut = SAMPLE_TEXTURE3D(_Lut3D, sampler_Lut3D, i.texcoord.xxx).rgb;
  55. if (abs(lut.r - i.texcoord.y) < _ScaleOffsetRes.w)
  56. curves.ra += (1.0).xx;
  57. if (abs(lut.g - i.texcoord.y) < _ScaleOffsetRes.w)
  58. curves.ga += (1.0).xx;
  59. if (abs(lut.b - i.texcoord.y) < _ScaleOffsetRes.w)
  60. curves.gba += float3(0.5, (1.0).xx);
  61. color = any(curves) ? curves : color;
  62. #endif
  63. #if AUTO_EXPOSURE
  64. // Current average luminance marker
  65. float luminanceAvg = GetHistogramBinFromLuminance(i.avgLuminance, _ScaleOffsetRes.xy);
  66. float avgPx = luminanceAvg * _ScaleOffsetRes.z;
  67. if (abs(i.texcoord.x - luminanceAvg) < _ScaleOffsetRes.z * 2.0)
  68. color.rgb = kAvgColor;
  69. #endif
  70. return color;
  71. }
  72. ENDHLSL
  73. SubShader
  74. {
  75. Cull Off ZWrite Off ZTest Always
  76. Pass
  77. {
  78. HLSLPROGRAM
  79. #pragma vertex Vert
  80. #pragma fragment Frag
  81. ENDHLSL
  82. }
  83. }
  84. }