From b94c56ec58935bab3370bd14a3d50d6c4707fbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Wed, 27 Mar 2024 16:02:28 +0100 Subject: [PATCH] fx: move tonemap shaders to engine art dir --- demos/06-material.c | 2 +- demos/art/fx/fxAces.fs | 16 -------- {demos => engine}/art/fx/fxTonemapACES.fs | 0 {demos => engine}/art/fx/fxTonemapExposure.fs | 0 {demos => engine}/art/fx/fxTonemapFilmic.fs | 0 {demos => engine}/art/fx/fxTonemapIlford.fs | 0 {demos => engine}/art/fx/fxTonemapReinhard.fs | 0 engine/art/fx/fxTonemapUchimura.fs | 41 +++++++++++++++++++ .../art/fx/fxTonemapUncharted.fs | 0 9 files changed, 42 insertions(+), 17 deletions(-) delete mode 100644 demos/art/fx/fxAces.fs rename {demos => engine}/art/fx/fxTonemapACES.fs (100%) rename {demos => engine}/art/fx/fxTonemapExposure.fs (100%) rename {demos => engine}/art/fx/fxTonemapFilmic.fs (100%) rename {demos => engine}/art/fx/fxTonemapIlford.fs (100%) rename {demos => engine}/art/fx/fxTonemapReinhard.fs (100%) create mode 100644 engine/art/fx/fxTonemapUchimura.fs rename {demos => engine}/art/fx/fxTonemapUncharted.fs (100%) diff --git a/demos/06-material.c b/demos/06-material.c index 43d9427..e642f35 100644 --- a/demos/06-material.c +++ b/demos/06-material.c @@ -28,7 +28,7 @@ int main() { // fx: load all post fx files in all subdirs. fx_load("fx**.fs"); - fx_enable(fx_find("fxAces.fs"), 1); + fx_enable(fx_find("fxTonemapACES.fs"), 1); // load video, RGB texture, no audio video_t *v = video( "pexels-pachon-in-motion-17486489.mp4", VIDEO_RGB | VIDEO_NO_AUDIO | VIDEO_LOOP ); video_seek(v, 30); diff --git a/demos/art/fx/fxAces.fs b/demos/art/fx/fxAces.fs deleted file mode 100644 index e43bd3c..0000000 --- a/demos/art/fx/fxAces.fs +++ /dev/null @@ -1,16 +0,0 @@ -out vec4 color; - -void main(void) { - vec2 uv = TEXCOORD.st; - vec3 src = texture2D(iChannel0, uv).rgb; - vec3 x = src; - - // aces film (CC0, src: https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/) - float a = 2.51f; - float b = 0.03f; - float c = 2.43f; - float d = 0.59f; - float e = 0.14f; - src = clamp((x*(a*x+b))/(x*(c*x+d)+e), 0.0, 1.0); - color = vec4(src, 1.0); -} diff --git a/demos/art/fx/fxTonemapACES.fs b/engine/art/fx/fxTonemapACES.fs similarity index 100% rename from demos/art/fx/fxTonemapACES.fs rename to engine/art/fx/fxTonemapACES.fs diff --git a/demos/art/fx/fxTonemapExposure.fs b/engine/art/fx/fxTonemapExposure.fs similarity index 100% rename from demos/art/fx/fxTonemapExposure.fs rename to engine/art/fx/fxTonemapExposure.fs diff --git a/demos/art/fx/fxTonemapFilmic.fs b/engine/art/fx/fxTonemapFilmic.fs similarity index 100% rename from demos/art/fx/fxTonemapFilmic.fs rename to engine/art/fx/fxTonemapFilmic.fs diff --git a/demos/art/fx/fxTonemapIlford.fs b/engine/art/fx/fxTonemapIlford.fs similarity index 100% rename from demos/art/fx/fxTonemapIlford.fs rename to engine/art/fx/fxTonemapIlford.fs diff --git a/demos/art/fx/fxTonemapReinhard.fs b/engine/art/fx/fxTonemapReinhard.fs similarity index 100% rename from demos/art/fx/fxTonemapReinhard.fs rename to engine/art/fx/fxTonemapReinhard.fs diff --git a/engine/art/fx/fxTonemapUchimura.fs b/engine/art/fx/fxTonemapUchimura.fs new file mode 100644 index 0000000..1151adc --- /dev/null +++ b/engine/art/fx/fxTonemapUchimura.fs @@ -0,0 +1,41 @@ +// Uchimura 2017, "HDR theory and practice" +// Math: https://www.desmos.com/calculator/gslcdxvipg +// Source: https://www.slideshare.net/nikuque/hdr-theory-and-practicce-jp +vec3 uchimura(vec3 x, float P, float a, float m, float l, float c, float b) { + float l0 = ((P - m) * l) / a; + float L0 = m - m / a; + float L1 = m + (1.0 - m) / a; + float S0 = m + l0; + float S1 = m + a * l0; + float C2 = (a * P) / (P - S1); + float CP = -C2 / P; + + vec3 w0 = vec3(1.0 - smoothstep(0.0, m, x)); + vec3 w2 = vec3(step(m + l0, x)); + vec3 w1 = vec3(1.0 - w0 - w2); + + vec3 T = vec3(m * pow(x / m, vec3(c)) + b); + vec3 S = vec3(P - (P - S1) * exp(CP * (x - S0))); + vec3 L = vec3(m + a * (x - m)); + + return T * w0 + L * w1 + S * w2; +} + +vec3 uchimura(vec3 x) { + const float P = 1.0; // max display brightness + const float a = 1.0; // contrast + const float m = 0.22; // linear section start + const float l = 0.4; // linear section length + const float c = 1.33; // black + const float b = 0.0; // pedestal + + return uchimura(x, P, a, m, l, c, b); +} + +out vec4 color; + +void main(void) { + vec2 uv = TEXCOORD.st; + vec4 src = texture2D(iChannel0, uv); + color = vec4( uchimura(src.xyz), src.a); +} diff --git a/demos/art/fx/fxTonemapUncharted.fs b/engine/art/fx/fxTonemapUncharted.fs similarity index 100% rename from demos/art/fx/fxTonemapUncharted.fs rename to engine/art/fx/fxTonemapUncharted.fs