1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-29 16:16:38 +00:00

Fix inconsistent color clamping between Mobile and Forward+.

Also remove inconsistencies with glow blending code and comments between the two shader files to allow for easier comparison of the two tonemap files.
This commit is contained in:
Allen Pestaluky
2025-11-18 10:09:03 -05:00
parent 9c561027fc
commit 2c6749ab9a
2 changed files with 18 additions and 23 deletions

View File

@@ -862,17 +862,14 @@ void main() {
}
if (bool(params.flags & FLAG_USE_GLOW) && params.glow_mode != GLOW_MODE_SOFTLIGHT) {
vec3 glow = gather_glow(source_glow, uv_interp);
vec3 glow = gather_glow(source_glow, uv_interp) * params.glow_intensity;
if (params.glow_map_strength > 0.001) {
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
}
if (params.glow_mode == GLOW_MODE_MIX) {
if (params.glow_map_strength > 0.001) {
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
}
color.rgb = mix(color.rgb, glow, params.glow_intensity);
color.rgb = color.rgb * (1.0 - params.glow_intensity) + glow;
} else {
glow = glow * params.glow_intensity;
if (params.glow_map_strength > 0.001) {
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
}
color.rgb = apply_glow(color.rgb, glow, params.white);
}
}
@@ -887,8 +884,7 @@ void main() {
// Apply soft light after tonemapping to mitigate the issue of discontinuity
// at 1.0 and higher. This makes the issue only appear with HDR output that
// can exceed a 1.0 output value.
vec3 glow = gather_glow(source_glow, uv_interp);
glow = glow * params.glow_intensity;
vec3 glow = gather_glow(source_glow, uv_interp) * params.glow_intensity;
if (params.glow_map_strength > 0.001) {
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
}

View File

@@ -225,9 +225,6 @@ vec3 tonemap_agx(vec3 color) {
}
vec3 linear_to_srgb(vec3 color) {
// Clamping is not strictly necessary for floating point nonlinear sRGB encoding,
// but many cases that call this function need the result clamped.
color = clamp(color, vec3(0.0), vec3(1.0));
const vec3 a = vec3(0.055f);
return mix((vec3(1.0f) + a) * pow(color.rgb, vec3(1.0f / 2.4f)) - a, 12.92f * color.rgb, lessThan(color.rgb, vec3(0.0031308f)));
}
@@ -248,7 +245,7 @@ vec3 apply_tonemapping(vec3 color, float white) { // inputs are LINEAR
return tonemap_filmic(max(vec3(0.0f), color), white);
} else if (tonemapper_aces) {
return tonemap_aces(max(vec3(0.0f), color), white);
} else { // FLAG_TONEMAPPER_AGX
} else { // tonemapper_agx
return tonemap_agx(color);
}
}
@@ -256,12 +253,12 @@ vec3 apply_tonemapping(vec3 color, float white) { // inputs are LINEAR
#ifdef USE_MULTIVIEW
vec3 gather_glow() {
vec2 uv = gl_FragCoord.xy * params.dest_pixel_size;
return textureLod(source_glow, vec3(uv, ViewIndex), 0.0).rgb;
return textureLod(source_glow, vec3(uv, ViewIndex), 0.0).rgb * params.luminance_multiplier;
}
#else
vec3 gather_glow() {
vec2 uv = gl_FragCoord.xy * params.dest_pixel_size;
return textureLod(source_glow, uv, 0.0).rgb;
return textureLod(source_glow, uv, 0.0).rgb * params.luminance_multiplier;
}
#endif // !USE_MULTIVIEW
@@ -728,15 +725,15 @@ void main() {
color.rgb *= params.exposure;
// Early Tonemap & SRGB Conversion
#ifndef SUBPASS
// Single-pass FXAA and pre-tonemap glow.
if (use_fxaa) {
// FXAA must be performed before glow to preserve the "bleed" effect of glow.
color.rgb = do_fxaa(color.rgb, params.exposure, uv_interp);
}
if (use_glow && !glow_mode_softlight) {
vec3 glow = gather_glow() * params.luminance_multiplier * params.glow_intensity;
vec3 glow = gather_glow() * params.glow_intensity;
if (use_glow_map) {
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
}
@@ -749,25 +746,27 @@ void main() {
}
#endif
// Tonemap to lower dynamic range.
color.rgb = apply_tonemapping(color.rgb, params.white);
#ifndef SUBPASS
// Glow
// Post-tonemap glow.
if (use_glow && glow_mode_softlight) {
// Apply soft light after tonemapping to mitigate the issue of discontinuity
// at 1.0 and higher. This makes the issue only appear with HDR output that
// can exceed a 1.0 output value.
vec3 glow = gather_glow() * params.glow_intensity * params.luminance_multiplier;
vec3 glow = gather_glow() * params.glow_intensity;
if (use_glow_map) {
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
}
glow = apply_tonemapping(glow, params.white);
color.rgb = apply_glow(color.rgb, glow, params.white);
}
#endif
// Additional effects
// Additional effects.
if (use_bcs) {
// Apply brightness: