uniform sampler2D bloom;
uniform mediump float exposureFactor;
uniform lowp float bloomIntensity;
+uniform lowp float saturation;
#ifdef GL_ES
varying mediump vec2 varTexCoord;
color.rgb *= whiteScale;
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
void main(void)
{
#if ENABLE_TONE_MAPPING
color = applyToneMapping(color);
+ color.rgb = applySaturation(color.rgb, saturation);
#endif
}
float m_bloom_strength;
CachedPixelShaderSetting<float> m_bloom_radius_pixel;
float m_bloom_radius;
+ float m_saturation;
+ CachedPixelShaderSetting<float> m_saturation_pixel;
public:
void onSettingsChange(const std::string &name)
m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f);
if (name == "bloom_radius")
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)
m_exposure_factor_pixel("exposureFactor"),
m_bloom_intensity_pixel("bloomIntensity"),
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("exposure_factor", settingsCallback, this);
g_settings->registerChangedCallback("bloom_intensity", settingsCallback, this);
g_settings->registerChangedCallback("bloom_strength_factor", settingsCallback, this);
g_settings->registerChangedCallback("bloom_radius", settingsCallback, this);
+ g_settings->registerChangedCallback("saturation", settingsCallback, this);
m_fog_enabled = g_settings->getBool("enable_fog");
m_user_exposure_factor = g_settings->getFloat("exposure_factor", 0.1f, 10.0f);
m_bloom_enabled = g_settings->getBool("enable_bloom");
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_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f);
+ m_saturation = g_settings->getFloat("saturation", 0.0f, 5.0f);
}
~GameGlobalShaderConstantSetter()
m_bloom_radius_pixel.set(&m_bloom_radius, services);
m_bloom_strength_pixel.set(&m_bloom_strength, services);
}
+ m_saturation_pixel.set(&m_saturation, services);
}
void onSetMaterial(const video::SMaterial &material)