diff options
author | Rie <riedev@proton.me> | 2024-06-15 23:27:00 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-09-25 12:34:23 +0200 |
commit | 5efa6ba4892aa03f56215719a347be2f1629e206 (patch) | |
tree | 40463d6d11fb9cf14f57ab807df1637a1adf3289 /drivers | |
parent | c3e16cda00a9fbec4515142f4c59bc5134f1bfb0 (diff) | |
download | redot-engine-5efa6ba4892aa03f56215719a347be2f1629e206.tar.gz |
Fix incorrect Reinhard tonemap operator
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gles3/shaders/tonemap_inc.glsl | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/gles3/shaders/tonemap_inc.glsl b/drivers/gles3/shaders/tonemap_inc.glsl index fb915aeb38..6738bdf748 100644 --- a/drivers/gles3/shaders/tonemap_inc.glsl +++ b/drivers/gles3/shaders/tonemap_inc.glsl @@ -76,8 +76,12 @@ vec3 tonemap_aces(vec3 color, float p_white) { return color_tonemapped / p_white_tonemapped; } +// Based on Reinhard's extended formula, see equation 4 in https://doi.org/cjbgrt vec3 tonemap_reinhard(vec3 color, float p_white) { - return (p_white * color + color) / (color * p_white + p_white); + float white_squared = p_white * p_white; + vec3 white_squared_color = white_squared * color; + // Equivalent to color * (1 + color / white_squared) / (1 + color) + return (white_squared_color + color * color) / (white_squared_color + white_squared); } #define TONEMAPPER_LINEAR 0 @@ -85,7 +89,7 @@ vec3 tonemap_reinhard(vec3 color, float p_white) { #define TONEMAPPER_FILMIC 2 #define TONEMAPPER_ACES 3 -vec3 apply_tonemapping(vec3 color, float p_white) { // inputs are LINEAR, always outputs clamped [0;1] color +vec3 apply_tonemapping(vec3 color, float p_white) { // inputs are LINEAR // Ensure color values passed to tonemappers are positive. // They can be negative in the case of negative lights, which leads to undesired behavior. if (tonemapper == TONEMAPPER_LINEAR) { |