From c22f8e3607cc01f53af0605132e076eabfe6bd23 Mon Sep 17 00:00:00 2001 From: Gary M Date: Fri, 31 May 2024 18:38:38 -0700 Subject: [PATCH 1/4] Initial AGX Impl --- Source/Engine/Graphics/PostProcessSettings.h | 5 ++ Source/Shaders/ColorGrading.shader | 58 ++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/Source/Engine/Graphics/PostProcessSettings.h b/Source/Engine/Graphics/PostProcessSettings.h index 525da3f36..4f3e4e080 100644 --- a/Source/Engine/Graphics/PostProcessSettings.h +++ b/Source/Engine/Graphics/PostProcessSettings.h @@ -52,6 +52,11 @@ API_ENUM() enum class ToneMappingMode /// The ACES Filmic reference tonemapper (approximation). /// ACES = 2, + + /// + /// The AGX tonemapper. + /// + AGX = 3, }; /// diff --git a/Source/Shaders/ColorGrading.shader b/Source/Shaders/ColorGrading.shader index ae4067b18..eea9c59e3 100644 --- a/Source/Shaders/ColorGrading.shader +++ b/Source/Shaders/ColorGrading.shader @@ -191,6 +191,60 @@ float3 TonemapACES(float3 linearColor) return saturate(color); } +#ifdef TONE_MAPPING_MODE_AGX + +float3 agxAscCdl(float3 color, float3 slope, float3 offset, float3 power, float sat) { + const float3 lw = float3(0.2126, 0.7152, 0.0722); + float luma = dot(color, lw); + float3 c = pow(color * slope + offset, power); + return luma + sat * (c - luma); +} + +float3 TonemapAGX(float3 linearColor) +{ + static const float3x3 AgXInsetMatrix = { + 0.8566, 0.1373, 0.1119, + 0.0951, 0.7612, 0.0768, + 0.0483, 0.1014, 0.8113 + }; + + static const float3x3 AgXOutsetMatrix = { + 1.1271, -0.1413, -0.1413, + -0.1106, 1.1578, -0.1106, + -0.0165, -0.0165, 1.2519 + }; + + static const float AgxMinEv = -12.47393; + static const float AgxMaxEv = 4.026069; + + float3 color = linearColor; + color = mul(color, AgXInsetMatrix); + color = max(color, 1e-10); + color = clamp(log2(color), AgxMinEv, AgxMaxEv); + color = (color - AgxMinEv) / (AgxMaxEv - AgxMinEv); + + color = clamp(color, 0.0, 1.0); + + float3 x2 = color * color; + float3 x4 = x2 * x2; + + color = + 15.5 * x4 * x2 + - 40.14 * x4 * color + + 31.96 * x4 + - 6.868 * x2 * color + + 0.4298 * x2 + + 0.1191 * color + - 0.00232; + + color = agxAscCdl(color, float3(1.0, 1.0, 1.0), float3(0.0, 0.0, 0.0), float3(1.35, 1.35, 1.35), 1.4); + + color = mul(color, AgXOutsetMatrix); + + color = clamp(color, 0.0, 1.0); + + return color; +} + #endif // Perfoms the tonemapping on the input linear color @@ -202,6 +256,8 @@ float3 Tonemap(float3 linearColor) return TonemapNeutral(linearColor); #elif defined(TONE_MAPPING_MODE_ACES) return TonemapACES(linearColor); +#elif defined(TONE_MAPPING_MODE_AGX) + return TonemapAGX(linearColor); #else return float3(0, 0, 0); #endif @@ -292,6 +348,7 @@ META_PS(true, FEATURE_LEVEL_ES2) META_PERMUTATION_1(TONE_MAPPING_MODE_NONE=1) META_PERMUTATION_1(TONE_MAPPING_MODE_NEUTRAL=1) META_PERMUTATION_1(TONE_MAPPING_MODE_ACES=1) +META_PERMUTATION_1(TONE_MAPPING_MODE_AGX=1) float4 PS_Lut2D(Quad_VS2PS input) : SV_Target { return CombineLUTs(input.TexCoord, 0); @@ -301,6 +358,7 @@ META_PS(true, FEATURE_LEVEL_ES2) META_PERMUTATION_1(TONE_MAPPING_MODE_NONE=1) META_PERMUTATION_1(TONE_MAPPING_MODE_NEUTRAL=1) META_PERMUTATION_1(TONE_MAPPING_MODE_ACES=1) +META_PERMUTATION_1(TONE_MAPPING_MODE_AGX=1) float4 PS_Lut3D(Quad_GS2PS input) : SV_Target { return CombineLUTs(input.Vertex.TexCoord, input.LayerIndex); From 1de395bc7befd963b0eaf7ac1cae5fcfdae0aa16 Mon Sep 17 00:00:00 2001 From: Gary M Date: Fri, 31 May 2024 19:04:07 -0700 Subject: [PATCH 2/4] returned lost #endif --- Source/Shaders/ColorGrading.shader | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Shaders/ColorGrading.shader b/Source/Shaders/ColorGrading.shader index eea9c59e3..fb36c4aa1 100644 --- a/Source/Shaders/ColorGrading.shader +++ b/Source/Shaders/ColorGrading.shader @@ -191,7 +191,9 @@ float3 TonemapACES(float3 linearColor) return saturate(color); } -#ifdef TONE_MAPPING_MODE_AGX +#endif + +#ifdef TONE_MAPPING_MODE_NEUTRAL float3 agxAscCdl(float3 color, float3 slope, float3 offset, float3 power, float sat) { const float3 lw = float3(0.2126, 0.7152, 0.0722); From 063a5d1ae48bd513b5d6fafa21435356dc29c377 Mon Sep 17 00:00:00 2001 From: Gary M Date: Fri, 31 May 2024 19:40:50 -0700 Subject: [PATCH 3/4] Disable "punchy" correction and add gamma correction --- Source/Shaders/ColorGrading.shader | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Shaders/ColorGrading.shader b/Source/Shaders/ColorGrading.shader index fb36c4aa1..cd5d0faf6 100644 --- a/Source/Shaders/ColorGrading.shader +++ b/Source/Shaders/ColorGrading.shader @@ -238,10 +238,12 @@ float3 TonemapAGX(float3 linearColor) + 0.1191 * color - 0.00232; - color = agxAscCdl(color, float3(1.0, 1.0, 1.0), float3(0.0, 0.0, 0.0), float3(1.35, 1.35, 1.35), 1.4); + // color = agxAscCdl(color, float3(1.0, 1.0, 1.0), float3(0.0, 0.0, 0.0), float3(1.35, 1.35, 1.35), 1.4); color = mul(color, AgXOutsetMatrix); + color = pow(max(float3(0.0, 0.0, 0.0), color), float3(2.2, 2.2, 2.2)); + color = clamp(color, 0.0, 1.0); return color; From 33ccdea7617b05bef22e8484ad1fa0d0d6d464ce Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 12 Sep 2024 09:02:48 +0200 Subject: [PATCH 4/4] Fixes and shader update #2673 --- Content/Shaders/ColorGrading.flax | 4 ++-- .../Graphics/GPUPipelineStatePermutations.h | 3 +++ Source/Engine/Renderer/ColorGradingPass.h | 2 +- Source/Shaders/ColorGrading.shader | 21 +++++++------------ 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/Content/Shaders/ColorGrading.flax b/Content/Shaders/ColorGrading.flax index c797e5b26..269dfa4a2 100644 --- a/Content/Shaders/ColorGrading.flax +++ b/Content/Shaders/ColorGrading.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e378171320ebc1c7516832a15576254d403508e1ae1e14c9af5cf30c75f231cc -size 10629 +oid sha256:304d96b72a53d4faa8bb6945b4d3a92199e5493c110e23d60e76a2c926149a47 +size 12322 diff --git a/Source/Engine/Graphics/GPUPipelineStatePermutations.h b/Source/Engine/Graphics/GPUPipelineStatePermutations.h index e3306fa92..44214056a 100644 --- a/Source/Engine/Graphics/GPUPipelineStatePermutations.h +++ b/Source/Engine/Graphics/GPUPipelineStatePermutations.h @@ -39,11 +39,13 @@ public: FORCE_INLINE GPUPipelineState* Get(int index) const { + ASSERT_LOW_LAYER(index >= 0 && index < Size); return States[index]; } FORCE_INLINE GPUPipelineState*& operator[](int32 index) { + ASSERT_LOW_LAYER(index >= 0 && index < Size); return States[index]; } @@ -129,6 +131,7 @@ public: public: FORCE_INLINE GPUShaderProgramCS* Get(const int index) const { + ASSERT_LOW_LAYER(index >= 0 && index < Size); return Shaders[index]; } diff --git a/Source/Engine/Renderer/ColorGradingPass.h b/Source/Engine/Renderer/ColorGradingPass.h index 39968a4e6..7da9a20df 100644 --- a/Source/Engine/Renderer/ColorGradingPass.h +++ b/Source/Engine/Renderer/ColorGradingPass.h @@ -15,7 +15,7 @@ private: bool _useVolumeTexture; PixelFormat _lutFormat; AssetReference _shader; - GPUPipelineStatePermutationsPs<3> _psLut; + GPUPipelineStatePermutationsPs<4> _psLut; public: diff --git a/Source/Shaders/ColorGrading.shader b/Source/Shaders/ColorGrading.shader index cd5d0faf6..59de00aa2 100644 --- a/Source/Shaders/ColorGrading.shader +++ b/Source/Shaders/ColorGrading.shader @@ -193,9 +193,10 @@ float3 TonemapACES(float3 linearColor) #endif -#ifdef TONE_MAPPING_MODE_NEUTRAL +#ifdef TONE_MAPPING_MODE_AGX -float3 agxAscCdl(float3 color, float3 slope, float3 offset, float3 power, float sat) { +float3 agxAscCdl(float3 color, float3 slope, float3 offset, float3 power, float sat) +{ const float3 lw = float3(0.2126, 0.7152, 0.0722); float luma = dot(color, lw); float3 c = pow(color * slope + offset, power); @@ -209,27 +210,23 @@ float3 TonemapAGX(float3 linearColor) 0.0951, 0.7612, 0.0768, 0.0483, 0.1014, 0.8113 }; - static const float3x3 AgXOutsetMatrix = { 1.1271, -0.1413, -0.1413, -0.1106, 1.1578, -0.1106, -0.0165, -0.0165, 1.2519 }; - static const float AgxMinEv = -12.47393; static const float AgxMaxEv = 4.026069; - float3 color = linearColor; + float3 color = linearColor; color = mul(color, AgXInsetMatrix); color = max(color, 1e-10); color = clamp(log2(color), AgxMinEv, AgxMaxEv); color = (color - AgxMinEv) / (AgxMaxEv - AgxMinEv); - - color = clamp(color, 0.0, 1.0); + color = saturate(color); float3 x2 = color * color; float3 x4 = x2 * x2; - color = + 15.5 * x4 * x2 - 40.14 * x4 * color + 31.96 * x4 @@ -239,14 +236,10 @@ float3 TonemapAGX(float3 linearColor) - 0.00232; // color = agxAscCdl(color, float3(1.0, 1.0, 1.0), float3(0.0, 0.0, 0.0), float3(1.35, 1.35, 1.35), 1.4); - color = mul(color, AgXOutsetMatrix); - color = pow(max(float3(0.0, 0.0, 0.0), color), float3(2.2, 2.2, 2.2)); - - color = clamp(color, 0.0, 1.0); - - return color; + color = saturate(color); + return color; } #endif