From 2195755869b64e94a9eb875e1eb20be98f879ab9 Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Wed, 8 Mar 2023 00:17:54 -0500 Subject: [PATCH] More fixes to the various post effects --- indra/newview/alrenderutils.h | 5 +- .../newview/app_settings/settings_alchemy.xml | 4 +- .../shaders/class1/alchemy/CASF.glsl | 2 +- .../shaders/class1/alchemy/DLSF.glsl | 2 - .../shaders/class1/alchemy/toneMapF.glsl | 55 ++++++++++++++++--- indra/newview/llviewershadermgr.cpp | 10 ++-- indra/newview/llviewershadermgr.h | 4 +- .../xui/en/floater_lightbox_settings.xml | 6 +- .../floater_preferences_graphics_advanced.xml | 54 +++++++++++++----- 9 files changed, 104 insertions(+), 38 deletions(-) diff --git a/indra/newview/alrenderutils.h b/indra/newview/alrenderutils.h index 07e35acb94b..983ab37ec9b 100644 --- a/indra/newview/alrenderutils.h +++ b/indra/newview/alrenderutils.h @@ -28,8 +28,6 @@ #include "llpointer.h" -#define AL_TONEMAP_COUNT 10 - class LLRenderTarget; class LLVertexBuffer; @@ -55,10 +53,11 @@ class ALRenderUtil TONEMAP_REINHARD2, TONEMAP_FILMIC, TONEMAP_UNREAL, - TONEMAP_ACES, + TONEMAP_ACES_NARCOWICZ, TONEMAP_UCHIMURA, TONEMAP_LOTTES, TONEMAP_UNCHARTED, + TONEMAP_ACES_HILL, TONEMAP_COUNT }; bool setupTonemap(); diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index 0d34fd025e8..becc6e5fdc3 100644 --- a/indra/newview/app_settings/settings_alchemy.xml +++ b/indra/newview/app_settings/settings_alchemy.xml @@ -1220,13 +1220,13 @@ <key>RenderToneMapType</key> <map> <key>Comment</key> - <string>Tonemapping type 0 - HDR Debug, 1 - Linear, 2 - Reinhard, 3 - Reinhard2, 4 - Filmic, 5 - Unreal, 6 - ACES, 7 - Uchimura, 8 - Lottes, 9 - Uncharted</string> + <string>Tonemapping type 0 - HDR Debug, 1 - Linear, 2 - Reinhard, 3 - Reinhard2, 4 - Filmic, 5 - Unreal, 6 - ACES Narkowicz, 7 - Uchimura, 8 - Lottes, 9 - Uncharted, 10 - Aces Hill</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>U32</string> <key>Value</key> - <integer>7</integer> + <integer>10</integer> </map> <key>RenderToneMapUchimuraA</key> <map> diff --git a/indra/newview/app_settings/shaders/class1/alchemy/CASF.glsl b/indra/newview/app_settings/shaders/class1/alchemy/CASF.glsl index c4e3dff7256..2a1c9942c4a 100644 --- a/indra/newview/app_settings/shaders/class1/alchemy/CASF.glsl +++ b/indra/newview/app_settings/shaders/class1/alchemy/CASF.glsl @@ -110,6 +110,6 @@ void main() vec3 outColor = clamp((window * wRGB + e) * rcpWeightRGB, 0, 1); outColor = mix(e, outColor, sharpen_params.x); - frag_color = vec4(linear_to_srgb(outColor),alpha); + frag_color = vec4(outColor,alpha); } diff --git a/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl b/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl index c2dc08e2f28..ff5073758c7 100644 --- a/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl +++ b/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl @@ -170,8 +170,6 @@ void main() x.y += delta; x.z += delta; - x.rgb = linear_to_srgb(x.rgb); - frag_color = x; } diff --git a/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl b/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl index 55c70ba6f93..6aa0245894d 100644 --- a/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl +++ b/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl @@ -73,7 +73,7 @@ vec3 unreal(vec3 x) return x / (x + 0.155) * 1.019; } -vec3 aces(vec3 x) +vec3 ACES_Narkowicz(vec3 x) { // Narkowicz 2015, "ACES Filmic Tone Mapping Curve" const float a = 2.51; @@ -84,7 +84,45 @@ vec3 aces(vec3 x) return (x * (a * x + b)) / (x * (c * x + d) + e); } -#if TONEMAP_METHOD == 7 // Uchimura +// ACES filmic tone map approximation +// see https://github.com/TheRealMJP/BakingLab/blob/master/BakingLab/ACES.hlsl + +// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT +const mat3 ACESInputMat = mat3 +( + 0.59719, 0.07600, 0.02840, + 0.35458, 0.90834, 0.13383, + 0.04823, 0.01566, 0.83777 +); + + +// ODT_SAT => XYZ => D60_2_D65 => sRGB +const mat3 ACESOutputMat = mat3 +( + 1.60475, -0.10208, -0.00327, + -0.53108, 1.10813, -0.07276, + -0.07367, -0.00605, 1.07602 +); + +vec3 RRTAndODTFit(vec3 color) +{ + vec3 a = color * (color + 0.0245786) - 0.000090537; + vec3 b = color * (0.983729 * color + 0.4329510) + 0.238081; + return a / b; +} + +vec3 ACES_Hill(vec3 color) +{ + color = ACESInputMat * color; + + // Apply RRT and ODT + color = RRTAndODTFit(color); + + color = ACESOutputMat * color; + + return color; +} + vec3 uchimura(vec3 x, float P, float a, float m, float l, float c, float b) { float l0 = ((P - m) * l) / a; @@ -119,9 +157,7 @@ vec3 uchimura(vec3 x) return uchimura(x, P, a, m, l, c, b); } -#endif -#if TONEMAP_METHOD == 8 // Lottes 2016, "Advanced Techniques and Optimization of HDR Color Pipelines" uniform vec3 tone_lottes_a = vec3(1.6, 0.977, 8.0); uniform vec3 tone_lottes_b = vec3(0.18, 0.267, 0.0); @@ -142,9 +178,7 @@ vec3 lottes(vec3 x) return pow(x, a) / (pow(x, a * d) * b + c); } -#endif -#if TONEMAP_METHOD == 9 // Hable, http://filmicworlds.com/blog/filmic-tonemapping-operators/ uniform vec3 tone_uncharted_a = vec3(0.15, 0.50, 0.10); // A, B, C uniform vec3 tone_uncharted_b = vec3(0.20, 0.02, 0.30); // D, E, F @@ -169,7 +203,6 @@ vec3 uncharted2(vec3 col) vec3 whiteScale = vec3(1.0f)/Uncharted2Tonemap(vec3(tone_uncharted_c.x)); return curr*whiteScale; } -#endif //================================= // borrowed noise from: @@ -238,9 +271,13 @@ void main() #elif TONEMAP_METHOD == 5 // Unreal method #define NEEDS_GAMMA_CORRECT 0 diff.rgb = unreal(diff.rgb); - #elif TONEMAP_METHOD == 6 // Aces method + #elif TONEMAP_METHOD == 6 // Aces Narkowicz method + #define NEEDS_GAMMA_CORRECT 1 + diff.rgb = ACES_Narkowicz(diff.rgb); + #elif TONEMAP_METHOD == 10 // Aces Hill method #define NEEDS_GAMMA_CORRECT 1 - diff.rgb = aces(diff.rgb); + diff.rgb *= 1.0/0.6; + diff.rgb = ACES_Hill(diff.rgb); #elif TONEMAP_METHOD == 7 // Uchimura's Gran Turismo method #define NEEDS_GAMMA_CORRECT 1 diff.rgb = uchimura(diff.rgb); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 6a60d0a603f..0069b92a5c8 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -206,8 +206,8 @@ LLGLSLShader gNormalMapGenProgram; LLGLSLShader gDeferredGenBrdfLutProgram; LLGLSLShader gDeferredPostCASProgram; LLGLSLShader gDeferredPostDLSProgram; -LLGLSLShader gDeferredPostTonemapProgram[AL_TONEMAP_COUNT]; -LLGLSLShader gDeferredPostColorGradeLUTProgram[AL_TONEMAP_COUNT]; +LLGLSLShader gDeferredPostTonemapProgram[ALRenderUtil::TONEMAP_COUNT]; +LLGLSLShader gDeferredPostColorGradeLUTProgram[ALRenderUtil::TONEMAP_COUNT]; // [RLVa:KB] - @setsphere LLGLSLShader gRlvSphereProgram; // [/RLVa:KB] @@ -597,7 +597,7 @@ void LLViewerShaderMgr::unloadShaders() gDeferredPostCASProgram.unload(); gDeferredPostDLSProgram.unload(); - for (U32 i = 0; i < AL_TONEMAP_COUNT; ++i) + for (U32 i = 0; i < ALRenderUtil::TONEMAP_COUNT; ++i) { gDeferredPostTonemapProgram[i].unload(); gDeferredPostColorGradeLUTProgram[i].unload(); @@ -1040,7 +1040,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredPostCASProgram.unload(); gDeferredPostDLSProgram.unload(); - for (U32 i = 0; i < AL_TONEMAP_COUNT; ++i) + for (U32 i = 0; i < ALRenderUtil::TONEMAP_COUNT; ++i) { gDeferredPostTonemapProgram[i].unload(); gDeferredPostColorGradeLUTProgram[i].unload(); @@ -2869,7 +2869,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gDeferredPostDLSProgram.createShader(NULL, NULL); } - for (U32 i = 0; i < AL_TONEMAP_COUNT; ++i) + for (U32 i = 0; i < ALRenderUtil::TONEMAP_COUNT; ++i) { if (success) { diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index c61ac04102d..243c76fc723 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -271,8 +271,8 @@ extern LLGLSLShader gNormalMapGenProgram; extern LLGLSLShader gDeferredGenBrdfLutProgram; extern LLGLSLShader gDeferredPostCASProgram; extern LLGLSLShader gDeferredPostDLSProgram; -extern LLGLSLShader gDeferredPostTonemapProgram[AL_TONEMAP_COUNT]; -extern LLGLSLShader gDeferredPostColorGradeLUTProgram[AL_TONEMAP_COUNT]; +extern LLGLSLShader gDeferredPostTonemapProgram[ALRenderUtil::TONEMAP_COUNT]; +extern LLGLSLShader gDeferredPostColorGradeLUTProgram[ALRenderUtil::TONEMAP_COUNT]; // [RLVa:KB] - @setsphere extern LLGLSLShader gRlvSphereProgram; // [/RLVa:KB] diff --git a/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml b/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml index 4a5cd786be8..455fc765bc2 100644 --- a/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml @@ -331,9 +331,13 @@ name="toneUnreal" value="5" /> <combo_box.item - label="ACES" + label="ACES Narkowicz" name="toneACES" value="6" /> + <combo_box.item + label="ACES Hill" + name="toneACES" + value="10" /> <combo_box.item label="Uchimura" name="toneUchimura" diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index 51a3055dab1..dc54e6bdd23 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -761,25 +761,53 @@ Tonemapper: </text> <combo_box - control_name="RenderTonemapper" + control_name="RenderToneMapType" height="18" layout="topleft" left_delta="130" top_delta="0" name="ToneMapper" width="150"> - <combo_box.item - label="Linear" - name="0" - value="0"/> - <combo_box.item - label="ACES Narkowicz" - name="1" - value="1"/> - <combo_box.item - label="ACES Hill" - name="2" - value="2"/> + <combo_box.item + label="Linear" + name="toneLinear" + value="1" /> + <combo_box.item + label="Reinhard" + name="toneReinhard" + value="2" /> + <combo_box.item + label="Reinhard2" + name="toneReinhard2" + value="3" /> + <combo_box.item + label="Filmic" + name="toneFilmic" + value="4" /> + <combo_box.item + label="Unreal" + name="toneUnreal" + value="5" /> + <combo_box.item + label="ACES Narkowicz" + name="toneACES" + value="6" /> + <combo_box.item + label="ACES Hill" + name="toneACES" + value="10" /> + <combo_box.item + label="Uchimura" + name="toneUchimura" + value="7" /> + <combo_box.item + label="Lottes" + name="toneLottes" + value="8" /> + <combo_box.item + label="Uncharted" + name="toneUncharted" + value="9" /> </combo_box> <slider -- GitLab