From 6c90d00d42ce8ac61b5f67c65d49f86bfbf2583c Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 20:29:19 +0900 Subject: [PATCH 01/20] Add support for AGX tone mapping --- src/constants.js | 3 +- .../tonemapping_pars_fragment.glsl.js | 72 +++++++++++++++++++ src/renderers/webgl/WebGLProgram.js | 6 +- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/constants.js b/src/constants.js index dfa7a9b329bdc4..a1d532214739ce 100644 --- a/src/constants.js +++ b/src/constants.js @@ -56,7 +56,8 @@ export const LinearToneMapping = 1; export const ReinhardToneMapping = 2; export const CineonToneMapping = 3; export const ACESFilmicToneMapping = 4; -export const CustomToneMapping = 5; +export const AGXToneMapping = 5; +export const CustomToneMapping = 6; export const AttachedBindMode = 'attached'; export const DetachedBindMode = 'detached'; diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 777da0761e198c..62a71c4c6c4e83 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -73,5 +73,77 @@ vec3 ACESFilmicToneMapping( vec3 color ) { } +// AGX Tone Mapping implementation from +// https://iolite-engine.com/blog_posts/minimal_agx_implementation +// https://www.shadertoy.com/view/cd3XWr +// Mean error^2: 3.6705141e-06 +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; + +} + +vec3 agx( vec3 val ) { + + const mat3 agx_mat = mat3( + 0.842479062253094, 0.0423282422610123, 0.0423756549057051, + 0.0784335999999992, 0.878468636469772, 0.0784336, + 0.0792237451477643, 0.0791661274605434, 0.879142973793104 + ); + + const float min_ev = -12.47393f; + const float max_ev = 4.026069f; + + // Input transform (inset) + val = agx_mat * val; + + // Log2 space encoding + val = clamp(log2(val), min_ev, max_ev); + val = (val - min_ev) / (max_ev - min_ev); + + // Apply sigmoid function approximation + val = agxDefaultContrastApprox(val); + + return val; + +} + +vec3 agxEotf( vec3 val ) { + + const mat3 agx_mat_inv = mat3( + 1.19687900512017, -0.0528968517574562, -0.0529716355144438, + -0.0980208811401368, 1.15190312990417, -0.0980434501171241, + -0.0990297440797205, -0.0989611768448433, 1.15107367264116 + ); + + // Inverse input transform (outset) + val = agx_mat_inv * val; + + // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display + // NOTE: We're linearizing the output here. Comment/adjust when + // *not* using a sRGB render target + val = pow(val, vec3(2.2)); + + return val; + +} + +vec3 AGXToneMapping( vec3 color ) { + + color = agx( color ); + color = agxEotf( color ); + return color; + +} + vec3 CustomToneMapping( vec3 color ) { return color; } `; diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 0f04631cd656b8..a167b97df4e1cc 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -1,7 +1,7 @@ import { WebGLUniforms } from './WebGLUniforms.js'; import { WebGLShader } from './WebGLShader.js'; import { ShaderChunk } from '../shaders/ShaderChunk.js'; -import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, GLSL3, LinearSRGBColorSpace, SRGBColorSpace, LinearDisplayP3ColorSpace, DisplayP3ColorSpace, P3Primaries, Rec709Primaries } from '../../constants.js'; +import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, AGXToneMapping, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, GLSL3, LinearSRGBColorSpace, SRGBColorSpace, LinearDisplayP3ColorSpace, DisplayP3ColorSpace, P3Primaries, Rec709Primaries } from '../../constants.js'; import { ColorManagement } from '../../math/ColorManagement.js'; // From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/ @@ -120,6 +120,10 @@ function getToneMappingFunction( functionName, toneMapping ) { toneMappingName = 'ACESFilmic'; break; + case AGXToneMapping: + toneMappingName = 'AGX'; + break; + case CustomToneMapping: toneMappingName = 'Custom'; break; From 65d043c117eeb282d75607af4071b26b79763497 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 20:39:27 +0900 Subject: [PATCH 02/20] Update tonemapping example --- examples/webgl_tonemapping.html | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/webgl_tonemapping.html b/examples/webgl_tonemapping.html index b19011b0c09361..e370f1bb96ecac 100644 --- a/examples/webgl_tonemapping.html +++ b/examples/webgl_tonemapping.html @@ -49,6 +49,7 @@ Reinhard: THREE.ReinhardToneMapping, Cineon: THREE.CineonToneMapping, ACESFilmic: THREE.ACESFilmicToneMapping, + AGX: THREE.AGXToneMapping, Custom: THREE.CustomToneMapping }; From b6f390a47d8df913f9070aa7a1481acccd702279 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 20:49:41 +0900 Subject: [PATCH 03/20] Update test --- test/unit/src/constants.tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/src/constants.tests.js b/test/unit/src/constants.tests.js index 99e829aa547a44..fbd0b2df6ed191 100644 --- a/test/unit/src/constants.tests.js +++ b/test/unit/src/constants.tests.js @@ -70,7 +70,7 @@ export default QUnit.module( 'Constants', () => { assert.equal( Constants.ReinhardToneMapping, 2, 'ReinhardToneMapping is equal to 2' ); assert.equal( Constants.CineonToneMapping, 3, 'CineonToneMapping is equal to 3' ); assert.equal( Constants.ACESFilmicToneMapping, 4, 'ACESFilmicToneMapping is equal to 4' ); - assert.equal( Constants.CustomToneMapping, 5, 'CustomToneMapping is equal to 5' ); + assert.equal( Constants.CustomToneMapping, 6, 'CustomToneMapping is equal to 6' ); assert.equal( Constants.AttachedBindMode, 'attached', 'AttachedBindMode is equal to attached' ); assert.equal( Constants.DetachedBindMode, 'detached', 'DetachedBindMode is equal to detached' ); From 5b4d89055eb628f0a74fc889f3910f85367e755f Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 21:09:41 +0900 Subject: [PATCH 04/20] AGX -> AgX --- examples/webgl_tonemapping.html | 2 +- src/constants.js | 2 +- .../shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js | 3 ++- src/renderers/webgl/WebGLProgram.js | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/webgl_tonemapping.html b/examples/webgl_tonemapping.html index e370f1bb96ecac..8a0bfad8ceb7e6 100644 --- a/examples/webgl_tonemapping.html +++ b/examples/webgl_tonemapping.html @@ -49,7 +49,7 @@ Reinhard: THREE.ReinhardToneMapping, Cineon: THREE.CineonToneMapping, ACESFilmic: THREE.ACESFilmicToneMapping, - AGX: THREE.AGXToneMapping, + AgX: THREE.AgXToneMapping, Custom: THREE.CustomToneMapping }; diff --git a/src/constants.js b/src/constants.js index a1d532214739ce..d74f577af05913 100644 --- a/src/constants.js +++ b/src/constants.js @@ -56,7 +56,7 @@ export const LinearToneMapping = 1; export const ReinhardToneMapping = 2; export const CineonToneMapping = 3; export const ACESFilmicToneMapping = 4; -export const AGXToneMapping = 5; +export const AgXToneMapping = 5; export const CustomToneMapping = 6; export const AttachedBindMode = 'attached'; export const DetachedBindMode = 'detached'; diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 62a71c4c6c4e83..039c1775440a6f 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -137,8 +137,9 @@ vec3 agxEotf( vec3 val ) { } -vec3 AGXToneMapping( vec3 color ) { +vec3 AgXToneMapping( vec3 color ) { + color *= toneMappingExposure; color = agx( color ); color = agxEotf( color ); return color; diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index a167b97df4e1cc..b5a5ee3310ff08 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -1,7 +1,7 @@ import { WebGLUniforms } from './WebGLUniforms.js'; import { WebGLShader } from './WebGLShader.js'; import { ShaderChunk } from '../shaders/ShaderChunk.js'; -import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, AGXToneMapping, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, GLSL3, LinearSRGBColorSpace, SRGBColorSpace, LinearDisplayP3ColorSpace, DisplayP3ColorSpace, P3Primaries, Rec709Primaries } from '../../constants.js'; +import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, GLSL3, LinearSRGBColorSpace, SRGBColorSpace, LinearDisplayP3ColorSpace, DisplayP3ColorSpace, P3Primaries, Rec709Primaries } from '../../constants.js'; import { ColorManagement } from '../../math/ColorManagement.js'; // From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/ @@ -120,8 +120,8 @@ function getToneMappingFunction( functionName, toneMapping ) { toneMappingName = 'ACESFilmic'; break; - case AGXToneMapping: - toneMappingName = 'AGX'; + case AgXToneMapping: + toneMappingName = 'AgX'; break; case CustomToneMapping: From 3f0f03763129ff1b9d0163e219297f3ced8e89ad Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 21:13:59 +0900 Subject: [PATCH 05/20] glsl lint, suffixes fix --- .../tonemapping_pars_fragment.glsl.js | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 039c1775440a6f..394fcc381bba71 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -82,58 +82,58 @@ 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; + return + 15.5 * x4 * x2 + - 40.14 * x4 * x + + 31.96 * x4 + - 6.868 * x2 * x + + 0.4298 * x2 + + 0.1191 * x + - 0.00232; } vec3 agx( vec3 val ) { - const mat3 agx_mat = mat3( - 0.842479062253094, 0.0423282422610123, 0.0423756549057051, - 0.0784335999999992, 0.878468636469772, 0.0784336, - 0.0792237451477643, 0.0791661274605434, 0.879142973793104 + const mat3 agx_mat = mat3( + 0.842479062253094, 0.0423282422610123, 0.0423756549057051, + 0.0784335999999992, 0.878468636469772, 0.0784336, + 0.0792237451477643, 0.0791661274605434, 0.879142973793104 ); - const float min_ev = -12.47393f; - const float max_ev = 4.026069f; + const float min_ev = -12.47393; + const float max_ev = 4.026069; - // Input transform (inset) - val = agx_mat * val; + // Input transform (inset) + val = agx_mat * val; - // Log2 space encoding - val = clamp(log2(val), min_ev, max_ev); - val = (val - min_ev) / (max_ev - min_ev); + // Log2 space encoding + val = clamp( log2( val ), min_ev, max_ev ); + val = ( val - min_ev ) / ( max_ev - min_ev ); - // Apply sigmoid function approximation - val = agxDefaultContrastApprox(val); + // Apply sigmoid function approximation + val = agxDefaultContrastApprox( val ); - return val; + return val; } vec3 agxEotf( vec3 val ) { const mat3 agx_mat_inv = mat3( - 1.19687900512017, -0.0528968517574562, -0.0529716355144438, - -0.0980208811401368, 1.15190312990417, -0.0980434501171241, - -0.0990297440797205, -0.0989611768448433, 1.15107367264116 + 1.19687900512017, -0.0528968517574562, -0.0529716355144438, + -0.0980208811401368, 1.15190312990417, -0.0980434501171241, + -0.0990297440797205, -0.0989611768448433, 1.15107367264116 ); // Inverse input transform (outset) - val = agx_mat_inv * val; + val = agx_mat_inv * val; - // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display - // NOTE: We're linearizing the output here. Comment/adjust when - // *not* using a sRGB render target - val = pow(val, vec3(2.2)); + // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display + // NOTE: We're linearizing the output here. Comment/adjust when + // *not* using a sRGB render target + val = pow( val, vec3( 2.2 ) ); - return val; + return val; } From 9a851a612f32b2cdf87cd219f9b34697a1b9a51c Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 23:55:26 +0900 Subject: [PATCH 06/20] Adjust tone mapping constant values --- src/constants.js | 4 ++-- test/unit/src/constants.tests.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/constants.js b/src/constants.js index d74f577af05913..b734005f3fc13c 100644 --- a/src/constants.js +++ b/src/constants.js @@ -56,8 +56,8 @@ export const LinearToneMapping = 1; export const ReinhardToneMapping = 2; export const CineonToneMapping = 3; export const ACESFilmicToneMapping = 4; -export const AgXToneMapping = 5; -export const CustomToneMapping = 6; +export const CustomToneMapping = 5; +export const AgXToneMapping = 6; export const AttachedBindMode = 'attached'; export const DetachedBindMode = 'detached'; diff --git a/test/unit/src/constants.tests.js b/test/unit/src/constants.tests.js index fbd0b2df6ed191..d0341aead2857c 100644 --- a/test/unit/src/constants.tests.js +++ b/test/unit/src/constants.tests.js @@ -70,7 +70,8 @@ export default QUnit.module( 'Constants', () => { assert.equal( Constants.ReinhardToneMapping, 2, 'ReinhardToneMapping is equal to 2' ); assert.equal( Constants.CineonToneMapping, 3, 'CineonToneMapping is equal to 3' ); assert.equal( Constants.ACESFilmicToneMapping, 4, 'ACESFilmicToneMapping is equal to 4' ); - assert.equal( Constants.CustomToneMapping, 6, 'CustomToneMapping is equal to 6' ); + assert.equal( Constants.CustomToneMapping, 5, 'CustomToneMapping is equal to 5' ); + assert.equal( Constants.AgXToneMapping, 6, 'AgXToneMapping is equal to 6' ); assert.equal( Constants.AttachedBindMode, 'attached', 'AttachedBindMode is equal to attached' ); assert.equal( Constants.DetachedBindMode, 'detached', 'DetachedBindMode is equal to detached' ); From 443caf8de9386dddd81d7994706bccd868016af4 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 06:59:51 -0800 Subject: [PATCH 07/20] Update src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js Co-authored-by: Don McCurdy --- .../shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 394fcc381bba71..1bdaaa438aa04e 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -137,6 +137,7 @@ vec3 agxEotf( vec3 val ) { } +// Input and output encoded as Linear-sRGB. vec3 AgXToneMapping( vec3 color ) { color *= toneMappingExposure; From fd579e1632bc6173c2e365c43706dd6375a0d30a Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 12 Dec 2023 07:01:02 -0800 Subject: [PATCH 08/20] Update src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js Co-authored-by: Don McCurdy --- .../shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 1bdaaa438aa04e..04aa7ed715e740 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -128,9 +128,7 @@ vec3 agxEotf( vec3 val ) { // Inverse input transform (outset) val = agx_mat_inv * val; - // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display - // NOTE: We're linearizing the output here. Comment/adjust when - // *not* using a sRGB render target + // Encode output to Linear-sRGB. val = pow( val, vec3( 2.2 ) ); return val; From 61aa151fa312f2f0a424e34e5cf2234e56c2788b Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Wed, 13 Dec 2023 12:56:17 +0100 Subject: [PATCH 09/20] Update OutputPass.js Add `AgX` support. --- examples/jsm/postprocessing/OutputPass.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/jsm/postprocessing/OutputPass.js b/examples/jsm/postprocessing/OutputPass.js index b3fe30301fc738..56746e894330c1 100644 --- a/examples/jsm/postprocessing/OutputPass.js +++ b/examples/jsm/postprocessing/OutputPass.js @@ -5,6 +5,7 @@ import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, + AgXToneMapping, ACESFilmicToneMapping, SRGBTransfer } from 'three'; @@ -59,6 +60,7 @@ class OutputPass extends Pass { else if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = ''; else if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = ''; else if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = ''; + else if ( this._toneMapping === AgXToneMapping ) this.material.defines.AGX_TONE_MAPPING = ''; this.material.needsUpdate = true; From 09b838d610cee7545842973cd4f6432f158b9de7 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Wed, 13 Dec 2023 12:57:48 +0100 Subject: [PATCH 10/20] Update OutputShader.js Add `AgX` support. --- examples/jsm/shaders/OutputShader.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/jsm/shaders/OutputShader.js b/examples/jsm/shaders/OutputShader.js index a0b5fafe2a19b6..e654d853a8d7f1 100644 --- a/examples/jsm/shaders/OutputShader.js +++ b/examples/jsm/shaders/OutputShader.js @@ -60,6 +60,10 @@ const OutputShader = { gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb ); + #elif defined( AGX_TONE_MAPPING ) + + gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb ); + #endif // color space From f797797c59c8c48fada82185486cdfd4ec98a482 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Thu, 14 Dec 2023 08:52:00 +0900 Subject: [PATCH 11/20] Clamp the values to be > 0.0 --- .../shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 04aa7ed715e740..3b44daef9d5e1f 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -138,6 +138,7 @@ vec3 agxEotf( vec3 val ) { // Input and output encoded as Linear-sRGB. vec3 AgXToneMapping( vec3 color ) { + color = max( vec3( 0.0 ), color ); color *= toneMappingExposure; color = agx( color ); color = agxEotf( color ); From f54a9bfdf77f9dc13b2d77eb918b96b1071d4d8f Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Fri, 15 Dec 2023 15:36:06 +0900 Subject: [PATCH 12/20] Add rec2020 matrices --- .../ShaderChunk/tonemapping_pars_fragment.glsl.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 3b44daef9d5e1f..e401c04adaafd7 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -73,6 +73,15 @@ vec3 ACESFilmicToneMapping( vec3 color ) { } +// https://www.itu.int/pub/R-REP-BT.2407-2017 +const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( + 1.6605, 0.5876, 0.0728, + 0.1246, 1.1329, 0.0083, + 0.0182, 0.1006, 1.1187 +); + +const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = inverse( LINEAR_SRGB_TO_LINEAR_REC2020 ); + // AGX Tone Mapping implementation from // https://iolite-engine.com/blog_posts/minimal_agx_implementation // https://www.shadertoy.com/view/cd3XWr From 70b9dde652a9172867c2d4e9b443c1b83c0db9b5 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Sat, 16 Dec 2023 21:24:46 +0900 Subject: [PATCH 13/20] Fix rec2020 conversion matrices --- .../ShaderChunk/tonemapping_pars_fragment.glsl.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index e401c04adaafd7..eb34d1dff83546 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -74,13 +74,13 @@ vec3 ACESFilmicToneMapping( vec3 color ) { } // https://www.itu.int/pub/R-REP-BT.2407-2017 -const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( - 1.6605, 0.5876, 0.0728, - 0.1246, 1.1329, 0.0083, - 0.0182, 0.1006, 1.1187 -); +const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = transpose( mat3( + vec3( 1.6605, - 0.5876, - 0.0728 ), + vec3( - 0.1246, 1.1329, - 0.0083 ), + vec3( - 0.0182, - 0.1006, 1.1187 ) +) ); -const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = inverse( LINEAR_SRGB_TO_LINEAR_REC2020 ); +const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = inverse( LINEAR_REC2020_TO_LINEAR_SRGB ); // AGX Tone Mapping implementation from // https://iolite-engine.com/blog_posts/minimal_agx_implementation From 731e64b9589901945ac8544d41a21e105cde553e Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Sat, 16 Dec 2023 21:28:34 +0900 Subject: [PATCH 14/20] Update implementation to be based on filament using rec 2020 color space --- .../tonemapping_pars_fragment.glsl.js | 68 +++++++++++++++---- 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index eb34d1dff83546..f90ec0319c6e6f 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -73,15 +73,6 @@ vec3 ACESFilmicToneMapping( vec3 color ) { } -// https://www.itu.int/pub/R-REP-BT.2407-2017 -const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = transpose( mat3( - vec3( 1.6605, - 0.5876, - 0.0728 ), - vec3( - 0.1246, 1.1329, - 0.0083 ), - vec3( - 0.0182, - 0.1006, 1.1187 ) -) ); - -const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = inverse( LINEAR_REC2020_TO_LINEAR_SRGB ); - // AGX Tone Mapping implementation from // https://iolite-engine.com/blog_posts/minimal_agx_implementation // https://www.shadertoy.com/view/cd3XWr @@ -147,11 +138,60 @@ vec3 agxEotf( vec3 val ) { // Input and output encoded as Linear-sRGB. vec3 AgXToneMapping( vec3 color ) { - color = max( vec3( 0.0 ), color ); - color *= toneMappingExposure; - color = agx( color ); - color = agxEotf( color ); - return color; + // https://www.itu.int/pub/R-REP-BT.2407-2017 + // matrix provided in row-major order so we transpose + const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = transpose( mat3( + vec3( 1.6605, - 0.5876, - 0.0728 ), + vec3( - 0.1246, 1.1329, - 0.0083 ), + vec3( - 0.0182, - 0.1006, 1.1187 ) + ) ); + + const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = inverse( LINEAR_REC2020_TO_LINEAR_SRGB ); + + const mat3 AgXInsetMatrix = mat3( + vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), + vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), + vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) + ); + const mat3 AgXOutsetMatrixInv = mat3( + vec3( 0.899796955911611, 0.11142098895748, 0.11142098895748 ), + vec3( 0.0871996192028351, 0.875575586156966, 0.0871996192028349 ), + vec3( 0.013003424885555, 0.0130034248855548, 0.801379391839686 ) + ); + const mat3 AgXOutsetMatrix = inverse(AgXOutsetMatrixInv); + + const float AgxMinEv = -12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) + const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) + + vec3 v = color; + v = LINEAR_SRGB_TO_LINEAR_REC2020 * v; + + v = max( vec3( 0.0 ), v ); + v *= toneMappingExposure; + + v = AgXInsetMatrix * v; + + // Log2 encoding + v = max(v, 1E-10); // avoid 0 or negative numbers for log2 + v = log2(v); + v = (v - AgxMinEv) / (AgxMaxEv - AgxMinEv); + + v = clamp(v, 0.0, 1.0); + + // Apply sigmoid + v = agxDefaultContrastApprox(v); + + // Apply AgX look + // v = agxLook(v, look); + + v = AgXOutsetMatrix * v; + + // Linearize + v = pow(max(vec3(0.0), v), vec3( 2.2 )); + + v = LINEAR_REC2020_TO_LINEAR_SRGB * v; + + return v; } From 47949205c37e6e55dcd8085d4d64876b0eca0169 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Sat, 16 Dec 2023 21:50:59 +0900 Subject: [PATCH 15/20] Spaces -> tabs --- .../tonemapping_pars_fragment.glsl.js | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index f90ec0319c6e6f..2f81e955128f53 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -160,8 +160,8 @@ vec3 AgXToneMapping( vec3 color ) { ); const mat3 AgXOutsetMatrix = inverse(AgXOutsetMatrixInv); - const float AgxMinEv = -12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) - const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) + const float AgxMinEv = -12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) + const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) vec3 v = color; v = LINEAR_SRGB_TO_LINEAR_REC2020 * v; @@ -169,25 +169,25 @@ vec3 AgXToneMapping( vec3 color ) { v = max( vec3( 0.0 ), v ); v *= toneMappingExposure; - v = AgXInsetMatrix * v; + v = AgXInsetMatrix * v; - // Log2 encoding - v = max(v, 1E-10); // avoid 0 or negative numbers for log2 - v = log2(v); - v = (v - AgxMinEv) / (AgxMaxEv - AgxMinEv); + // Log2 encoding + v = max(v, 1E-10); // avoid 0 or negative numbers for log2 + v = log2(v); + v = (v - AgxMinEv) / (AgxMaxEv - AgxMinEv); - v = clamp(v, 0.0, 1.0); + v = clamp(v, 0.0, 1.0); - // Apply sigmoid - v = agxDefaultContrastApprox(v); + // Apply sigmoid + v = agxDefaultContrastApprox(v); - // Apply AgX look - // v = agxLook(v, look); + // Apply AgX look + // v = agxLook(v, look); - v = AgXOutsetMatrix * v; + v = AgXOutsetMatrix * v; - // Linearize - v = pow(max(vec3(0.0), v), vec3( 2.2 )); + // Linearize + v = pow(max(vec3(0.0), v), vec3( 2.2 )); v = LINEAR_REC2020_TO_LINEAR_SRGB * v; From 0ac1f6ab583e183ba7ed865b092b033be85dc790 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Sat, 16 Dec 2023 22:08:12 +0900 Subject: [PATCH 16/20] linting --- .../tonemapping_pars_fragment.glsl.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 2f81e955128f53..f94a0fc291f5d4 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -100,7 +100,7 @@ vec3 agx( vec3 val ) { 0.0792237451477643, 0.0791661274605434, 0.879142973793104 ); - const float min_ev = -12.47393; + const float min_ev = - 12.47393; const float max_ev = 4.026069; // Input transform (inset) @@ -120,9 +120,9 @@ vec3 agx( vec3 val ) { vec3 agxEotf( vec3 val ) { const mat3 agx_mat_inv = mat3( - 1.19687900512017, -0.0528968517574562, -0.0529716355144438, - -0.0980208811401368, 1.15190312990417, -0.0980434501171241, - -0.0990297440797205, -0.0989611768448433, 1.15107367264116 + 1.19687900512017, - 0.0528968517574562, - 0.0529716355144438, + - 0.0980208811401368, 1.15190312990417, - 0.0980434501171241, + - 0.0990297440797205, - 0.0989611768448433, 1.15107367264116 ); // Inverse input transform (outset) @@ -160,8 +160,8 @@ vec3 AgXToneMapping( vec3 color ) { ); const mat3 AgXOutsetMatrix = inverse(AgXOutsetMatrixInv); - const float AgxMinEv = -12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) - const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) + const float AgxMinEv = - 12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) + const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) vec3 v = color; v = LINEAR_SRGB_TO_LINEAR_REC2020 * v; @@ -172,14 +172,14 @@ vec3 AgXToneMapping( vec3 color ) { v = AgXInsetMatrix * v; // Log2 encoding - v = max(v, 1E-10); // avoid 0 or negative numbers for log2 - v = log2(v); - v = (v - AgxMinEv) / (AgxMaxEv - AgxMinEv); + v = max( v, 1e-10 ); // avoid 0 or negative numbers for log2 + v = log2( v ); + v = ( v - AgxMinEv ) / ( AgxMaxEv - AgxMinEv ); - v = clamp(v, 0.0, 1.0); + v = clamp( v, 0.0, 1.0 ); // Apply sigmoid - v = agxDefaultContrastApprox(v); + v = agxDefaultContrastApprox( v ); // Apply AgX look // v = agxLook(v, look); @@ -187,7 +187,7 @@ vec3 AgXToneMapping( vec3 color ) { v = AgXOutsetMatrix * v; // Linearize - v = pow(max(vec3(0.0), v), vec3( 2.2 )); + v = pow( max( vec3( 0.0 ), v ), vec3( 2.2 ) ); v = LINEAR_REC2020_TO_LINEAR_SRGB * v; From c5f70be66a90b0252b29d6302ce3376661b3a65c Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 19 Dec 2023 10:10:05 +0900 Subject: [PATCH 17/20] Code cleanup --- .../tonemapping_pars_fragment.glsl.js | 93 ++++++------------- 1 file changed, 27 insertions(+), 66 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index f94a0fc291f5d4..fc835e71d78c70 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -73,9 +73,9 @@ vec3 ACESFilmicToneMapping( vec3 color ) { } -// AGX Tone Mapping implementation from + // https://iolite-engine.com/blog_posts/minimal_agx_implementation -// https://www.shadertoy.com/view/cd3XWr +// // Mean error^2: 3.6705141e-06 vec3 agxDefaultContrastApprox( vec3 x ) { @@ -92,62 +92,24 @@ vec3 agxDefaultContrastApprox( vec3 x ) { } -vec3 agx( vec3 val ) { - - const mat3 agx_mat = mat3( - 0.842479062253094, 0.0423282422610123, 0.0423756549057051, - 0.0784335999999992, 0.878468636469772, 0.0784336, - 0.0792237451477643, 0.0791661274605434, 0.879142973793104 - ); - - const float min_ev = - 12.47393; - const float max_ev = 4.026069; - - // Input transform (inset) - val = agx_mat * val; - - // Log2 space encoding - val = clamp( log2( val ), min_ev, max_ev ); - val = ( val - min_ev ) / ( max_ev - min_ev ); - - // Apply sigmoid function approximation - val = agxDefaultContrastApprox( val ); - - return val; - -} - -vec3 agxEotf( vec3 val ) { - - const mat3 agx_mat_inv = mat3( - 1.19687900512017, - 0.0528968517574562, - 0.0529716355144438, - - 0.0980208811401368, 1.15190312990417, - 0.0980434501171241, - - 0.0990297440797205, - 0.0989611768448433, 1.15107367264116 - ); - - // Inverse input transform (outset) - val = agx_mat_inv * val; - - // Encode output to Linear-sRGB. - val = pow( val, vec3( 2.2 ) ); - - return val; - -} - // Input and output encoded as Linear-sRGB. vec3 AgXToneMapping( vec3 color ) { + // Matrices for rec 2020 <> rec 709 color space conversion + // matrix provided in row-major order so it has been transposed // https://www.itu.int/pub/R-REP-BT.2407-2017 - // matrix provided in row-major order so we transpose - const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = transpose( mat3( - vec3( 1.6605, - 0.5876, - 0.0728 ), - vec3( - 0.1246, 1.1329, - 0.0083 ), - vec3( - 0.0182, - 0.1006, 1.1187 ) - ) ); + const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3( + vec3( 1.6605, - 0.1246, - 0.0182 ), + vec3( - 0.5876, 1.1329, - 0.1006 ), + vec3( - 0.0728, - 0.0083, 1.1187 ) + ); + // TODO: add implementation const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = inverse( LINEAR_REC2020_TO_LINEAR_SRGB ); + // AGX Tone Mapping implementation based on Filament, which is in turn based + // on Blender's implementation for rec 2020 colors: + // https://github.com/google/filament/pull/7236 const mat3 AgXInsetMatrix = mat3( vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), @@ -158,40 +120,39 @@ vec3 AgXToneMapping( vec3 color ) { vec3( 0.0871996192028351, 0.875575586156966, 0.0871996192028349 ), vec3( 0.013003424885555, 0.0130034248855548, 0.801379391839686 ) ); - const mat3 AgXOutsetMatrix = inverse(AgXOutsetMatrixInv); + const mat3 AgXOutsetMatrix = inverse( AgXOutsetMatrixInv ); const float AgxMinEv = - 12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) - vec3 v = color; - v = LINEAR_SRGB_TO_LINEAR_REC2020 * v; + color = LINEAR_SRGB_TO_LINEAR_REC2020 * color; - v = max( vec3( 0.0 ), v ); - v *= toneMappingExposure; + color = max( vec3( 0.0 ), color ); + color *= toneMappingExposure; - v = AgXInsetMatrix * v; + color = AgXInsetMatrix * color; // Log2 encoding - v = max( v, 1e-10 ); // avoid 0 or negative numbers for log2 - v = log2( v ); - v = ( v - AgxMinEv ) / ( AgxMaxEv - AgxMinEv ); + color = max( color, 1e-10 ); // avoid 0 or negative numbers for log2 + color = log2( color ); + color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv ); - v = clamp( v, 0.0, 1.0 ); + color = clamp( color, 0.0, 1.0 ); // Apply sigmoid - v = agxDefaultContrastApprox( v ); + color = agxDefaultContrastApprox( color ); // Apply AgX look // v = agxLook(v, look); - v = AgXOutsetMatrix * v; + color = AgXOutsetMatrix * color; // Linearize - v = pow( max( vec3( 0.0 ), v ), vec3( 2.2 ) ); + color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) ); - v = LINEAR_REC2020_TO_LINEAR_SRGB * v; + color = LINEAR_REC2020_TO_LINEAR_SRGB * color; - return v; + return color; } From bbbd07570e41b2e585662fc52772c39950c4214e Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 19 Dec 2023 10:23:46 +0900 Subject: [PATCH 18/20] Support WebGL1, rearrange --- .../tonemapping_pars_fragment.glsl.js | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index fc835e71d78c70..bc6e82f1a09b93 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -73,6 +73,20 @@ vec3 ACESFilmicToneMapping( vec3 color ) { } +// Matrices for rec 2020 <> rec 709 color space conversion +// matrix provided in row-major order so it has been transposed +// https://www.itu.int/pub/R-REP-BT.2407-2017 +const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3( + vec3( 1.6605, - 0.1246, - 0.0182 ), + vec3( - 0.5876, 1.1329, - 0.1006 ), + vec3( - 0.0728, - 0.0083, 1.1187 ) +); + +const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( + vec3( 0.6274, 0.0691, 0.0164 ), + vec3( 0.3293, 0.9195, 0.0880 ), + vec3( 0.0433, 0.0113, 0.8956 ) +); // https://iolite-engine.com/blog_posts/minimal_agx_implementation // @@ -95,36 +109,26 @@ vec3 agxDefaultContrastApprox( vec3 x ) { // Input and output encoded as Linear-sRGB. vec3 AgXToneMapping( vec3 color ) { - // Matrices for rec 2020 <> rec 709 color space conversion - // matrix provided in row-major order so it has been transposed - // https://www.itu.int/pub/R-REP-BT.2407-2017 - const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3( - vec3( 1.6605, - 0.1246, - 0.0182 ), - vec3( - 0.5876, 1.1329, - 0.1006 ), - vec3( - 0.0728, - 0.0083, 1.1187 ) - ); - - // TODO: add implementation - const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = inverse( LINEAR_REC2020_TO_LINEAR_SRGB ); - - // AGX Tone Mapping implementation based on Filament, which is in turn based - // on Blender's implementation for rec 2020 colors: - // https://github.com/google/filament/pull/7236 + // AgX constants const mat3 AgXInsetMatrix = mat3( vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) ); - const mat3 AgXOutsetMatrixInv = mat3( - vec3( 0.899796955911611, 0.11142098895748, 0.11142098895748 ), - vec3( 0.0871996192028351, 0.875575586156966, 0.0871996192028349 ), - vec3( 0.013003424885555, 0.0130034248855548, 0.801379391839686 ) + + // explicit AgXOutsetMatrix generated from Filaments AgXOutsetMatixInv + const mat3 AgXOutsetMatrix = mat3( + vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), + vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), + vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 ) ); - const mat3 AgXOutsetMatrix = inverse( AgXOutsetMatrixInv ); const float AgxMinEv = - 12.47393; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) const float AgxMaxEv = 4.026069; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) + // AGX Tone Mapping implementation based on Filament, which is in turn based + // on Blender's implementation for rec 2020 colors: + // https://github.com/google/filament/pull/7236 color = LINEAR_SRGB_TO_LINEAR_REC2020 * color; color = max( vec3( 0.0 ), color ); From 67ad152d3767dee21c22f38e98d9026e9f26d1c1 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 19 Dec 2023 10:47:39 +0900 Subject: [PATCH 19/20] Comments update --- .../shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index bc6e82f1a09b93..2ef5010291cec0 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -89,7 +89,6 @@ const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( ); // https://iolite-engine.com/blog_posts/minimal_agx_implementation -// // Mean error^2: 3.6705141e-06 vec3 agxDefaultContrastApprox( vec3 x ) { @@ -116,7 +115,7 @@ vec3 AgXToneMapping( vec3 color ) { vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) ); - // explicit AgXOutsetMatrix generated from Filaments AgXOutsetMatixInv + // explicit AgXOutsetMatrix generated from Filaments AgXOutsetMatrixInv const mat3 AgXOutsetMatrix = mat3( vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), From 2044446113256327650a7a9a1b985bab3d1ac4ed Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Tue, 19 Dec 2023 12:15:52 +0900 Subject: [PATCH 20/20] Remove redundant clamp --- .../shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js index 2ef5010291cec0..89e1b3c6d9c626 100644 --- a/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js @@ -129,8 +129,6 @@ vec3 AgXToneMapping( vec3 color ) { // on Blender's implementation for rec 2020 colors: // https://github.com/google/filament/pull/7236 color = LINEAR_SRGB_TO_LINEAR_REC2020 * color; - - color = max( vec3( 0.0 ), color ); color *= toneMappingExposure; color = AgXInsetMatrix * color;