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