12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // Based on https://github.com/Filoppi/PumboAutoHDR
- /*
- [configuration]
- [OptionRangeFloat]
- GUIName = HDR Display Max Nits
- OptionName = HDR_DISPLAY_MAX_NITS
- MinValue = 80
- MaxValue = 2000
- StepAmount = 1
- DefaultValue = 400
- [OptionRangeFloat]
- GUIName = Shoulder Start Alpha
- OptionName = AUTO_HDR_SHOULDER_START_ALPHA
- MinValue = 0
- MaxValue = 1
- StepAmount = 0.01
- DefaultValue = 0
- [OptionRangeFloat]
- GUIName = Shoulder Pow
- OptionName = AUTO_HDR_SHOULDER_POW
- MinValue = 1
- MaxValue = 10
- StepAmount = 0.05
- DefaultValue = 2.5
- [/configuration]
- */
- float luminance(float3 color)
- {
- return dot(color, float3(0.2126f, 0.7152f, 0.0722f));
- }
- void main()
- {
- float4 color = Sample();
- // Nothing to do here, we are in SDR
- if (!OptionEnabled(hdr_output) || !OptionEnabled(linear_space_output))
- {
- SetOutput(color);
- return;
- }
- const float hdr_paper_white = hdr_paper_white_nits / hdr_sdr_white_nits;
- // Restore the original SDR (0-1) brightness (we might or might not restore it later)
- color.rgb /= hdr_paper_white;
- // Find the color luminance (it works better than average)
- float sdr_ratio = luminance(color.rgb);
- const float auto_hdr_max_white = max(HDR_DISPLAY_MAX_NITS / (hdr_paper_white_nits / hdr_sdr_white_nits), hdr_sdr_white_nits) / hdr_sdr_white_nits;
- if (sdr_ratio > AUTO_HDR_SHOULDER_START_ALPHA && AUTO_HDR_SHOULDER_START_ALPHA < 1.0)
- {
- const float auto_hdr_shoulder_ratio = 1.0 - (max(1.0 - sdr_ratio, 0.0) / (1.0 - AUTO_HDR_SHOULDER_START_ALPHA));
- const float auto_hdr_extra_ratio = pow(auto_hdr_shoulder_ratio, AUTO_HDR_SHOULDER_POW) * (auto_hdr_max_white - 1.0);
- const float auto_hdr_total_ratio = sdr_ratio + auto_hdr_extra_ratio;
- color.rgb *= auto_hdr_total_ratio / sdr_ratio;
- }
- color.rgb *= hdr_paper_white;
- SetOutput(color);
- }
|