Skip to content

Commit

Permalink
Clamp negative colors regardless of the tonemapper to avoid artifacts
Browse files Browse the repository at this point in the history
Color artifacts could be visible when using negative lights with the
Filmic and ACES tonemapping operators, as these did not clamp negative
colors.
  • Loading branch information
Calinou committed Aug 9, 2021
1 parent feebeb0 commit 313527b
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions drivers/gles3/shaders/tonemap.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -160,10 +160,6 @@ vec3 tonemap_aces(vec3 color, float white) {
}

vec3 tonemap_reinhard(vec3 color, float white) {
// Ensure color values are positive.
// They can be negative in the case of negative lights, which leads to undesired behavior.
color = max(vec3(0.0), color);

return clamp((white * color + color) / (color * white + white), vec3(0.0f), vec3(1.0f));
}

Expand Down Expand Up @@ -347,8 +343,9 @@ void main() {
#endif

// Early Tonemap & SRGB Conversion; note that Linear tonemapping does not clamp to [0, 1]; some operations below expect a [0, 1] range and will clamp

color = apply_tonemapping(color, white);
// Ensure color values are positive.
// They can be negative in the case of negative lights, which leads to undesired behavior.
color = apply_tonemapping(max(vec3(0.0), color), white);

#ifdef KEEP_3D_LINEAR
// leave color as is (-> don't convert to SRGB)
Expand Down

0 comments on commit 313527b

Please sign in to comment.