summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRie <riedev@proton.me>2024-06-15 23:27:00 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-09-25 12:34:23 +0200
commit5efa6ba4892aa03f56215719a347be2f1629e206 (patch)
tree40463d6d11fb9cf14f57ab807df1637a1adf3289 /drivers
parentc3e16cda00a9fbec4515142f4c59bc5134f1bfb0 (diff)
downloadredot-engine-5efa6ba4892aa03f56215719a347be2f1629e206.tar.gz
Fix incorrect Reinhard tonemap operator
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gles3/shaders/tonemap_inc.glsl8
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) {