diff --git a/indra/newview/alrenderutils.h b/indra/newview/alrenderutils.h index 07e35acb94b851c4dd1335ce413b6e471aec7f7c..983ab37ec9bf0eb2f7301691cc7f2e2a97d86c41 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 0d34fd025e844560da88d1578813acf50644fd9c..becc6e5fdc3e046285ddf5b75c8d0af857dd5643 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 c4e3dff725687f0eb915fcb0f8bbcbaa1ecad2b2..2a1c9942c4a3e7602f2a068d95edac9fc1cba6fd 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 c2dc08e2f286e77f4c0767a8d2b5bd513902fccb..ff5073758c790da7459aa980ba82e2005c006653 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 55c70ba6f93fbf688cf7d5bd20a93af18c6df74f..6aa0245894d0bb13b60947a77e8ce5e132a2a899 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 6a60d0a603f7b32df134e6926370d33bf7d18dc2..0069b92a5c8f7594e7bd57729fd90b4c44b1f5be 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 c61ac04102dbeb8bce43d6874b0fd716d66f1a07..243c76fc723c732f2ca918270c67743e1c34f5c2 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 4a5cd786be81d924a316de020861bc8fcdd401d5..455fc765bc267bcc9c2c97d111c6d48593c2c018 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 51a3055dab115171037d166d642c926bd6211d9b..dc54e6bdd230805fc7744211caf8cb7a5472f4e7 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