mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-04-18 03:55:53 -05:00
If the user hasn't set a HDR DISPLAY MAX NITS, the first time a game is launched using DirectX11 or 12, the queried display values are saved in the ini Of course user settings always take preference. But for someone that doesn't have the HDR settings set, the correct default value should be set so clipping and those bright neon/fluorescent colors can be avoided.
70 lines
1.7 KiB
GLSL
70 lines
1.7 KiB
GLSL
// 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);
|
|
}
|