Add configurable saturation (#12865)

* Add configurable saturation

Co-authored-by: Pevernow <3450354617@qq.com>
Co-authored-by: x2048 <codeforsmile@gmail.com>

Author:    Lars <larsh@apache.org>
This commit is contained in:
lhofhansl 2022-11-18 11:49:52 -08:00 committed by GitHub
parent dac05a500e
commit 7bf64fc61a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 1 deletions

@ -366,6 +366,15 @@ enable_shaders (Shaders) bool true
# enhanced, highlights and shadows are gradually compressed. # enhanced, highlights and shadows are gradually compressed.
tone_mapping (Filmic tone mapping) bool false tone_mapping (Filmic tone mapping) bool false
# Adjust the saturation (or vividness) of the scene
# Values
# < 1.0 decrease saturation
# > 1.0 increase saturation
# 1.0 = unchanged saturation
# 0.0 = black and white
# (Tone mapping needs to be enabled.)
saturation (Saturation) float 1.0 0.0 5.0
[**Waving Nodes] [**Waving Nodes]
# Set to true to enable waving leaves. # Set to true to enable waving leaves.

@ -5,6 +5,7 @@ uniform sampler2D rendered;
uniform sampler2D bloom; uniform sampler2D bloom;
uniform mediump float exposureFactor; uniform mediump float exposureFactor;
uniform lowp float bloomIntensity; uniform lowp float bloomIntensity;
uniform lowp float saturation;
#ifdef GL_ES #ifdef GL_ES
varying mediump vec2 varTexCoord; varying mediump vec2 varTexCoord;
@ -57,6 +58,14 @@ vec4 applyToneMapping(vec4 color)
color.rgb *= whiteScale; color.rgb *= whiteScale;
return color; return color;
} }
vec3 applySaturation(vec3 color, float factor)
{
// Calculate the perceived luminosity from the RGB color.
// See also: https://www.w3.org/WAI/GL/wiki/Relative_luminance
float brightness = dot(color, vec3(0.2125, 0.7154, 0.0721));
return mix(vec3(brightness), color, factor);
}
#endif #endif
void main(void) void main(void)
@ -85,6 +94,7 @@ void main(void)
{ {
#if ENABLE_TONE_MAPPING #if ENABLE_TONE_MAPPING
color = applyToneMapping(color); color = applyToneMapping(color);
color.rgb = applySaturation(color.rgb, saturation);
#endif #endif
} }

@ -436,6 +436,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
float m_bloom_strength; float m_bloom_strength;
CachedPixelShaderSetting<float> m_bloom_radius_pixel; CachedPixelShaderSetting<float> m_bloom_radius_pixel;
float m_bloom_radius; float m_bloom_radius;
float m_saturation;
CachedPixelShaderSetting<float> m_saturation_pixel;
public: public:
void onSettingsChange(const std::string &name) void onSettingsChange(const std::string &name)
@ -450,6 +452,8 @@ public:
m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f); m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f);
if (name == "bloom_radius") if (name == "bloom_radius")
m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f); m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f);
if (name == "saturation")
m_saturation = g_settings->getFloat("saturation", 0.0f, 5.0f);
} }
static void settingsCallback(const std::string &name, void *userdata) static void settingsCallback(const std::string &name, void *userdata)
@ -484,19 +488,22 @@ public:
m_exposure_factor_pixel("exposureFactor"), m_exposure_factor_pixel("exposureFactor"),
m_bloom_intensity_pixel("bloomIntensity"), m_bloom_intensity_pixel("bloomIntensity"),
m_bloom_strength_pixel("bloomStrength"), m_bloom_strength_pixel("bloomStrength"),
m_bloom_radius_pixel("bloomRadius") m_bloom_radius_pixel("bloomRadius"),
m_saturation_pixel("saturation")
{ {
g_settings->registerChangedCallback("enable_fog", settingsCallback, this); g_settings->registerChangedCallback("enable_fog", settingsCallback, this);
g_settings->registerChangedCallback("exposure_factor", settingsCallback, this); g_settings->registerChangedCallback("exposure_factor", settingsCallback, this);
g_settings->registerChangedCallback("bloom_intensity", settingsCallback, this); g_settings->registerChangedCallback("bloom_intensity", settingsCallback, this);
g_settings->registerChangedCallback("bloom_strength_factor", settingsCallback, this); g_settings->registerChangedCallback("bloom_strength_factor", settingsCallback, this);
g_settings->registerChangedCallback("bloom_radius", settingsCallback, this); g_settings->registerChangedCallback("bloom_radius", settingsCallback, this);
g_settings->registerChangedCallback("saturation", settingsCallback, this);
m_fog_enabled = g_settings->getBool("enable_fog"); m_fog_enabled = g_settings->getBool("enable_fog");
m_user_exposure_factor = g_settings->getFloat("exposure_factor", 0.1f, 10.0f); m_user_exposure_factor = g_settings->getFloat("exposure_factor", 0.1f, 10.0f);
m_bloom_enabled = g_settings->getBool("enable_bloom"); m_bloom_enabled = g_settings->getBool("enable_bloom");
m_bloom_intensity = g_settings->getFloat("bloom_intensity", 0.01f, 1.0f); m_bloom_intensity = g_settings->getFloat("bloom_intensity", 0.01f, 1.0f);
m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f); m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f);
m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f); m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f);
m_saturation = g_settings->getFloat("saturation", 0.0f, 5.0f);
} }
~GameGlobalShaderConstantSetter() ~GameGlobalShaderConstantSetter()
@ -584,6 +591,7 @@ public:
m_bloom_radius_pixel.set(&m_bloom_radius, services); m_bloom_radius_pixel.set(&m_bloom_radius, services);
m_bloom_strength_pixel.set(&m_bloom_strength, services); m_bloom_strength_pixel.set(&m_bloom_strength, services);
} }
m_saturation_pixel.set(&m_saturation, services);
} }
void onSetMaterial(const video::SMaterial &material) void onSetMaterial(const video::SMaterial &material)

@ -276,6 +276,7 @@ void set_default_settings()
settings->setDefault("bloom_strength_factor", "1.0"); settings->setDefault("bloom_strength_factor", "1.0");
settings->setDefault("bloom_intensity", "0.05"); settings->setDefault("bloom_intensity", "0.05");
settings->setDefault("bloom_radius", "1"); settings->setDefault("bloom_radius", "1");
settings->setDefault("saturation", "1.0");
// Effects Shadows // Effects Shadows
settings->setDefault("enable_dynamic_shadows", "false"); settings->setDefault("enable_dynamic_shadows", "false");