Skip to content

Commit f0f7887

Browse files
GS: Add gamma control to ShadeBoost
1 parent f34db72 commit f0f7887

File tree

10 files changed

+45
-5
lines changed

10 files changed

+45
-5
lines changed

bin/resources/shaders/dx11/shadeboost.fx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ float4 ContrastSaturationBrightness(float4 color) // Ported to HLSL
2121
float brt = params.x;
2222
float con = params.y;
2323
float sat = params.z;
24+
float gam = params.w;
2425

2526
// Increase or decrease these values to adjust r, g and b color channels separately
2627
const float AvgLumR = 0.5;
@@ -34,8 +35,10 @@ float4 ContrastSaturationBrightness(float4 color) // Ported to HLSL
3435
float3 intensity = dot(brtColor, LumCoeff);
3536
float3 satColor = lerp(intensity, brtColor, sat);
3637
float3 conColor = lerp(AvgLumin, satColor, con);
37-
38-
color.rgb = conColor;
38+
39+
float3 csb = conColor;
40+
csb = pow(csb, 1.0 / gam);
41+
color.rgb = csb;
3942
return color;
4043
}
4144

bin/resources/shaders/opengl/shadeboost.glsl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ vec4 ContrastSaturationBrightness(vec4 color)
3030
float brt = params.x;
3131
float con = params.y;
3232
float sat = params.z;
33+
float gam = params.w;
3334

3435
// Increase or decrease these values to adjust r, g and b color channels separately
3536
const float AvgLumR = 0.5;
@@ -45,7 +46,10 @@ vec4 ContrastSaturationBrightness(vec4 color)
4546
vec3 satColor = mix(intensity, brtColor, sat);
4647
vec3 conColor = mix(AvgLumin, satColor, con);
4748

48-
color.rgb = conColor;
49+
vec3 csb = conColor;
50+
csb = pow(csb, vec3(1.0 / gam));
51+
color.rgb = csb;
52+
4953
return color;
5054
}
5155

bin/resources/shaders/vulkan/shadeboost.glsl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ vec4 ContrastSaturationBrightness(vec4 color)
4444
float brt = params.x;
4545
float con = params.y;
4646
float sat = params.z;
47+
float gam = params.w;
4748

4849
// Increase or decrease these values to adjust r, g and b color channels separately
4950
const float AvgLumR = 0.5;
@@ -59,7 +60,9 @@ vec4 ContrastSaturationBrightness(vec4 color)
5960
vec3 satColor = mix(intensity, brtColor, sat);
6061
vec3 conColor = mix(AvgLumin, satColor, con);
6162

62-
color.rgb = conColor;
63+
vec3 csb = conColor;
64+
csb = pow(csb, vec3(1.0 / gam));
65+
color.rgb = csb;
6366
return color;
6467
}
6568

pcsx2-qt/Settings/GraphicsSettingsWidget.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
135135
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.shadeBoost, "EmuCore/GS", "ShadeBoost", false);
136136
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostBrightness, "EmuCore/GS", "ShadeBoost_Brightness", false);
137137
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostContrast, "EmuCore/GS", "ShadeBoost_Contrast", false);
138+
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostGamma, "EmuCore/GS", "ShadeBoost_Gamma", false);
138139
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostSaturation, "EmuCore/GS", "ShadeBoost_Saturation", false);
139140
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.tvShader, "EmuCore/GS", "TVShader", DEFAULT_TV_SHADER_MODE);
140141
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.casMode, "EmuCore/GS", "CASMode", static_cast<int>(GSCASMode::Disabled));
@@ -739,6 +740,8 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
739740

740741
dialog->registerWidgetHelp(m_ui.shadeBoostContrast, tr("Contrast"), tr("50"), tr("Adjusts contrast. 50 is normal."));
741742

743+
dialog->registerWidgetHelp(m_ui.shadeBoostGamma, tr("Gamma"), tr("50"), tr("Adjusts gamma. 50 is normal."));
744+
742745
dialog->registerWidgetHelp(m_ui.shadeBoostSaturation, tr("Saturation"), tr("50"), tr("Adjusts saturation. 50 is normal."));
743746

744747
dialog->registerWidgetHelp(m_ui.tvShader, tr("TV Shader"), tr("None (Default)"),
@@ -950,6 +953,7 @@ void GraphicsSettingsWidget::onShadeBoostChanged()
950953
const bool enabled = m_dialog->getEffectiveBoolValue("EmuCore/GS", "ShadeBoost", false);
951954
m_ui.shadeBoostBrightness->setEnabled(enabled);
952955
m_ui.shadeBoostContrast->setEnabled(enabled);
956+
m_ui.shadeBoostGamma->setEnabled(enabled);
953957
m_ui.shadeBoostSaturation->setEnabled(enabled);
954958
}
955959

pcsx2-qt/Settings/GraphicsSettingsWidget.ui

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,23 @@
15151515
</property>
15161516
</widget>
15171517
</item>
1518+
<item>
1519+
<widget class="QLabel" name="gammaLabel">
1520+
<property name="text">
1521+
<string>Gamma:</string>
1522+
</property>
1523+
</widget>
1524+
</item>
1525+
<item>
1526+
<widget class="QSpinBox" name="shadeBoostGamma">
1527+
<property name="minimum">
1528+
<number>1</number>
1529+
</property>
1530+
<property name="maximum">
1531+
<number>100</number>
1532+
</property>
1533+
</widget>
1534+
</item>
15181535
<item>
15191536
<widget class="QLabel" name="saturationLabel">
15201537
<property name="text">

pcsx2/Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,7 @@ struct Pcsx2Config
818818
u8 ShadeBoost_Brightness = 50;
819819
u8 ShadeBoost_Contrast = 50;
820820
u8 ShadeBoost_Saturation = 50;
821+
u8 ShadeBoost_Gamma = 50;
821822
u8 PNGCompressionLevel = 1;
822823

823824
u16 SWExtraThreads = 2;

pcsx2/GS/Renderers/Common/GSDevice.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,7 @@ void GSDevice::ShadeBoost()
768768
static_cast<float>(GSConfig.ShadeBoost_Brightness) * (1.0f / 50.0f),
769769
static_cast<float>(GSConfig.ShadeBoost_Contrast) * (1.0f / 50.0f),
770770
static_cast<float>(GSConfig.ShadeBoost_Saturation) * (1.0f / 50.0f),
771+
static_cast<float>(GSConfig.ShadeBoost_Gamma) * (1.0f / 50.0f),
771772
};
772773

773774
DoShadeBoost(m_current, m_target_tmp, params);

pcsx2/GS/Renderers/Metal/convert.metal

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ fragment float4 ps_shadeboost(float4 p [[position]], DirectReadTextureIn<float>
417417
const float brt = cb.x;
418418
const float con = cb.y;
419419
const float sat = cb.z;
420+
const float gam = cb.w;
420421
// Increase or decrease these values to adjust r, g and b color channels separately
421422
const float AvgLumR = 0.5;
422423
const float AvgLumG = 0.5;
@@ -431,5 +432,7 @@ fragment float4 ps_shadeboost(float4 p [[position]], DirectReadTextureIn<float>
431432
float3 satColor = mix(intensity, brtColor, sat);
432433
float3 conColor = mix(AvgLumin, satColor, con);
433434

435+
float3 csb = pow(conColor, float3(1.0 / gam));
436+
434437
return float4(conColor, 1);
435438
}

pcsx2/ImGui/FullscreenUI.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4326,12 +4326,14 @@ void FullscreenUI::DrawGraphicsSettingsPage(SettingsInterface* bsi, bool show_ad
43264326
{
43274327
const bool shadeboost_active = GetEffectiveBoolSetting(bsi, "EmuCore/GS", "ShadeBoost", false);
43284328

4329-
DrawToggleSetting(bsi, FSUI_CSTR("Shade Boost"), FSUI_CSTR("Enables brightness/contrast/saturation adjustment."), "EmuCore/GS",
4329+
DrawToggleSetting(bsi, FSUI_CSTR("Shade Boost"), FSUI_CSTR("Enables brightness/contrast/gamma/saturation adjustment."), "EmuCore/GS",
43304330
"ShadeBoost", false);
43314331
DrawIntRangeSetting(bsi, FSUI_CSTR("Shade Boost Brightness"), FSUI_CSTR("Adjusts brightness. 50 is normal."), "EmuCore/GS",
43324332
"ShadeBoost_Brightness", 50, 1, 100, "%d", shadeboost_active);
43334333
DrawIntRangeSetting(bsi, FSUI_CSTR("Shade Boost Contrast"), FSUI_CSTR("Adjusts contrast. 50 is normal."), "EmuCore/GS",
43344334
"ShadeBoost_Contrast", 50, 1, 100, "%d", shadeboost_active);
4335+
DrawIntRangeSetting(bsi, FSUI_CSTR("Shade Boost Gamma"), FSUI_CSTR("Adjusts gamma. 50 is normal."), "EmuCore/GS",
4336+
"ShadeBoost_Gamma", 50, 1, 100, "%d", shadeboost_active);
43354337
DrawIntRangeSetting(bsi, FSUI_CSTR("Shade Boost Saturation"), FSUI_CSTR("Adjusts saturation. 50 is normal."), "EmuCore/GS",
43364338
"ShadeBoost_Saturation", 50, 1, 100, "%d", shadeboost_active);
43374339

pcsx2/Pcsx2Config.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,7 @@ bool Pcsx2Config::GSOptions::OptionsAreEqual(const GSOptions& right) const
838838
OpEqu(ShadeBoost_Brightness) &&
839839
OpEqu(ShadeBoost_Contrast) &&
840840
OpEqu(ShadeBoost_Saturation) &&
841+
OpEqu(ShadeBoost_Gamma) &&
841842
OpEqu(PNGCompressionLevel) &&
842843
OpEqu(SaveDrawStart) &&
843844
OpEqu(SaveDrawCount) &&
@@ -1029,6 +1030,7 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap)
10291030
SettingsWrapBitfield(ShadeBoost_Brightness);
10301031
SettingsWrapBitfield(ShadeBoost_Contrast);
10311032
SettingsWrapBitfield(ShadeBoost_Saturation);
1033+
SettingsWrapBitfield(ShadeBoost_Gamma);
10321034
SettingsWrapBitfield(ExclusiveFullscreenControl);
10331035
SettingsWrapBitfieldEx(PNGCompressionLevel, "png_compression_level");
10341036
SettingsWrapBitfieldEx(SaveDrawStart, "SaveDrawStart");

0 commit comments

Comments
 (0)