From aae64aa8f8284b6960d855e51c2adb38353bff47 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sat, 5 Apr 2025 08:12:43 +0000 Subject: [PATCH 1/3] Update leenkx/Shaders/std/tonemap.glsl --- leenkx/Shaders/std/tonemap.glsl | 49 ++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/leenkx/Shaders/std/tonemap.glsl b/leenkx/Shaders/std/tonemap.glsl index a2ce7eb..d68a150 100644 --- a/leenkx/Shaders/std/tonemap.glsl +++ b/leenkx/Shaders/std/tonemap.glsl @@ -1,4 +1,3 @@ - vec3 uncharted2Tonemap(const vec3 x) { const float A = 0.15; const float B = 0.50; @@ -36,3 +35,51 @@ vec3 acesFilm(const vec3 x) { vec3 tonemapReinhard(const vec3 color) { return color / (color + vec3(1.0)); } + +// Blender AgX Implementation +// Troy Sobotka https://github.com/sobotka/AgX + +// AGX Simple +vec3 tonemapAgXSimple(vec3 x) { + const vec3 AgX_A = vec3(0.5, 0.5, 0.5); + const vec3 AgX_B = vec3(0.5, 0.5, 0.5); + const vec3 AgX_C = vec3(1.0, 1.0, 1.0); + const vec3 AgX_D = vec3(0.0, 0.0, 0.0); + const vec3 AgX_E = vec3(0.0, 0.0, 0.0); + const vec3 AgX_F = vec3(1.0, 1.0, 1.0); + + return (x * (AgX_A * x + AgX_B)) / (x * (AgX_C * x + AgX_D) + AgX_E) + AgX_F; +} + +// AGX Full Contrast Approx +vec3 agxDefaultContrastApprox(vec3 x) { + vec3 x2 = x * x; + vec3 x4 = x2 * x2; + return + 15.5 * x4 * x2 + - 40.14 * x4 * x + + 31.96 * x4 + - 6.868 * x2 * x + + 0.4298 * x2 + + 0.1191 * x + - 0.00232; +} +// AGX Full Look +vec3 agxLook(vec3 x, float strength) { + const vec3 slope = vec3(1.0); + const vec3 power = vec3(1.35); + const vec3 sat = vec3(1.4); + vec3 lw = vec3(0.2126, 0.7152, 0.0722); + float luma = dot(x, lw); + return pow(x * slope, power) * sat - (pow(luma * slope, power) * (sat - 1.0)); +} + +// AGX Full +vec3 tonemapAgXFull(vec3 x) { + // x *= 2.0 * (1.0/0.8); // Brightness scale to match Blender's default + x = clamp(x, 0.0, 65504.0); + x = log2(x + 1.0); + x = agxDefaultContrastApprox(clamp(x * 0.5 - 10.5, -12.0, 12.0)); + x = mix(x, agxLook(x, 0.5), 0.5); + x = clamp(x, 0.0, 1.0); + return pow(x, vec3(1.0/2.2)); +} From 7a2976ced1a9b856d373918c5bb28608250c8572 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sat, 5 Apr 2025 08:18:32 +0000 Subject: [PATCH 2/3] Update leenkx/blender/lnx/props_renderpath.py --- leenkx/blender/lnx/props_renderpath.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/props_renderpath.py b/leenkx/blender/lnx/props_renderpath.py index 3bedbcb..dfa05ad 100644 --- a/leenkx/blender/lnx/props_renderpath.py +++ b/leenkx/blender/lnx/props_renderpath.py @@ -613,8 +613,10 @@ class LnxRPListItem(bpy.types.PropertyGroup): ('Filmic', 'Filmic', 'Filmic'), ('Filmic2', 'Filmic2', 'Filmic2'), ('Reinhard', 'Reinhard', 'Reinhard'), - ('Uncharted', 'Uncharted', 'Uncharted')], - name='Tonemap', description='Tonemapping operator', default='Filmic', update=assets.invalidate_shader_cache) + ('Uncharted', 'Uncharted', 'Uncharted'), + ('AgXsimple', 'AgX (Simple)', 'AgX Simple Implementation'), + ('AgXfull', 'AgX (Full)', 'AgX Full Implementation')], + name='Tonemap', description='Tonemapping operator', default='AgXfull', update=assets.invalidate_shader_cache) lnx_fisheye: BoolProperty(name="Fish Eye", default=False, update=assets.invalidate_shader_cache) lnx_vignette: BoolProperty(name="Vignette", default=False, update=assets.invalidate_shader_cache) lnx_vignette_strength: FloatProperty(name="Strength", default=0.7, update=assets.invalidate_shader_cache) From cae7963b21473d63a3461ddb89fceae65934fdad Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sat, 5 Apr 2025 08:25:54 +0000 Subject: [PATCH 3/3] Update leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl --- .../compositor_pass/compositor_pass.frag.glsl | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl b/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl index f86716c..10a3211 100644 --- a/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl +++ b/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl @@ -475,7 +475,11 @@ fragColor.rgb = min(fragColor.rgb, 65504 * 0.5); } else { fragColor.rgb = mix(midLumColor, maxLumColor, luminance); } - + } else if (PPComp4.x == 9){ + fragColor.rgb = tonemapAgXSimple(fragColor.rgb); + fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2)); // To gamma + } else if (PPComp4.x == 10){ + fragColor.rgb = tonemapAgXFull(fragColor.rgb); } else { fragColor.rgb = vec3(0,1,0); //ERROR } @@ -498,6 +502,13 @@ fragColor.rgb = min(fragColor.rgb, 65504 * 0.5); fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2)); // To gamma fragColor.rgb = clamp(fragColor.rgb, 0.0, 2.2); #endif + #ifdef _CToneAgXsimple + fragColor.rgb = tonemapAgXSimple(fragColor.rgb); + fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2)); // To gamma + #endif + #ifdef _CToneAgXfull + fragColor.rgb = tonemapAgXFull(fragColor.rgb); + #endif #ifdef _CToneNone fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2)); // To gamma #endif