From b5739323e1a37b3a59eb738b8620c2e2c02a4c55 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 1 Jul 2020 13:27:19 -0700 Subject: SL-12978: Fix off-axis water dimming --- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index dcb02bd1c1..5bb2d18890 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -81,13 +81,8 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou haze_weight = vec4(haze_density) / temp1; //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) - temp2.y = max(0.0, tmpLightnorm.y); - if (abs(temp2.y) > 0.000001f) - { - temp2.y = 1. / abs(temp2.y); - } - temp2.y = max(0.0000001f, temp2.y); - sunlight *= exp(-light_atten * temp2.y); + // SL-12978: temp2.y = 1; optimized away + sunlight *= exp(-light_atten); // main atmospheric scattering line integral temp2.z = Plen * dens_mul; -- cgit v1.2.3 From 152db2280b797117edcc0d79e0d8bec9a8dc92af Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 1 Jul 2020 13:28:11 -0700 Subject: SL-12978: Cleanup --- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 5bb2d18890..ac0d5f08ee 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -47,13 +47,13 @@ float getAmbientClamp() } -void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) { - +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) +{ vec3 P = inPositionEye; //(TERRAIN) limit altitude - if (P.y > max_y) P *= (max_y / P.y); - if (P.y < -max_y) P *= (-max_y / P.y); + if (P.y > max_y) P *= ( max_y / P.y); + if (P.y < -max_y) P *= (-max_y / P.y); vec3 tmpLightnorm = lightnorm.xyz; -- cgit v1.2.3 From 9f0225abaa3011de0845a330fb6d7ef60ab20039 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 1 Jul 2020 13:29:35 -0700 Subject: SL-12978 Add note about similar code in C++ and GLSL --- .../shaders/class1/windlight/atmosphericsFuncs.glsl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index ac0d5f08ee..4d12c5d19a 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -136,11 +136,13 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a); } + // Similar/Shared Algorithms: + // indra\llinventory\llsettingssky.cpp -- LLSettingsSky::calculateLightSettings() + // indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars() //haze color - additive = - vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient) - + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x - + tmpAmbient)); + vec3 cs = sunlight.rgb * (1.-cloud_shadow); + additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) + + (haze_horizon * haze_weight.rgb) * (cs * temp2.x + tmpAmbient.rgb); //brightness of surface both sunlight and ambient sunlit = sunlight.rgb * 0.5; -- cgit v1.2.3 From 57147a198e2899be136750f874729aaf817db298 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Thu, 2 Jul 2020 14:47:54 -0700 Subject: SL-13539 Fix a white artifact over the water at certain angles --- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 4d12c5d19a..b7741ff48d 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -100,7 +100,8 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou temp2.x = dot(Pn, tmpLightnorm.xyz); // dampen sun additive contrib when not facing it... - if (length(light_dir) > 0.01) + // SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees. + // if (length(light_dir) > 0.01) { temp2.x *= max(0.0f, dot(light_dir, Pn)); } -- cgit v1.2.3 From 31924129227eb28bae6949e4b2b8fd6d5cffed61 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Sun, 16 Aug 2020 14:16:17 -0700 Subject: SL-13465 Partially restore atmospheric effects for the moon. --- indra/newview/app_settings/shaders/class1/windlight/moonF.glsl | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl index 24f3992e32..310bb15fdf 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl @@ -44,6 +44,9 @@ uniform sampler2D altDiffuseMap; uniform float blend_factor; // interp factor between moon A/B VARYING vec2 vary_texcoord0; +vec3 getAdditiveColor(); +vec3 scaleSoftClip(vec3 light); + void main() { vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy); @@ -59,6 +62,12 @@ void main() c.rgb = pow(c.rgb, exp); //c.rgb *= moonlight_color.rgb; + // Partial atmospherics calculation + vec3 ac = getAdditiveColor(); + c.rgb += ac; + + c.rgb = scaleSoftClip(c.rgb); + frag_color = vec4(c.rgb, c.a); } -- cgit v1.2.3 From f156730f3b3671be15bc769c0f17c5a7f4cb3faa Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Sun, 16 Aug 2020 14:19:54 -0700 Subject: SL-13465 Fix local scalar mix masking global mix() function. --- indra/newview/app_settings/shaders/class1/windlight/moonF.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl index 310bb15fdf..72d2c4cdfa 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl @@ -56,9 +56,9 @@ void main() // mix factor which blends when sunlight is brighter // and shows true moon color at night vec3 luma_weights = vec3(0.3, 0.5, 0.3); - float mix = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights); + float blend = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights); - vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0 - 1.0; + vec3 exp = vec3(1.0 - blend * moon_brightness) * 2.0 - 1.0; c.rgb = pow(c.rgb, exp); //c.rgb *= moonlight_color.rgb; -- cgit v1.2.3 From 9de1f91daedaa7676909d09a7524afb8d9a23d92 Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Fri, 21 Aug 2020 16:49:11 -0600 Subject: SL-13743 revert part of SL-12978 change that broke low-angle sunlight --- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index b7741ff48d..140d788fff 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -81,8 +81,13 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou haze_weight = vec4(haze_density) / temp1; //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) - // SL-12978: temp2.y = 1; optimized away - sunlight *= exp(-light_atten); + temp2.y = max(0.0, tmpLightnorm.y); + if (abs(temp2.y) > 0.000001f) + { + temp2.y = 1. / abs(temp2.y); + } + temp2.y = max(0.0000001f, temp2.y); + sunlight *= exp(-light_atten * temp2.y); // main atmospheric scattering line integral temp2.z = Plen * dens_mul; -- cgit v1.2.3 From 912afc940bc2e9680630ce2e9b282ecfc9b84050 Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Tue, 1 Sep 2020 13:45:11 -0600 Subject: SL-12978 refactor sunlight intensity calculation --- .../shaders/class1/windlight/atmosphericsFuncs.glsl | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 140d788fff..bc6b006afa 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -80,14 +80,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou blue_weight = blue_density / temp1; haze_weight = vec4(haze_density) / temp1; - //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) - temp2.y = max(0.0, tmpLightnorm.y); - if (abs(temp2.y) > 0.000001f) - { - temp2.y = 1. / abs(temp2.y); - } - temp2.y = max(0.0000001f, temp2.y); - sunlight *= exp(-light_atten * temp2.y); + //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain) + float above_horizon_angle = abs(tmpLightnorm.z); + sunlight *= exp(-light_atten * above_horizon_angle); // for atten and angle in [0..1], this maps to something like [0.3..1] // main atmospheric scattering line integral temp2.z = Plen * dens_mul; -- cgit v1.2.3 From 04eba4c3eae812a18f29fd378901287ad318b4dd Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Tue, 1 Sep 2020 13:57:51 -0600 Subject: SL-12978 de-obfuscate, banish the temps --- .../class1/windlight/atmosphericsFuncs.glsl | 68 +++++++++------------- 1 file changed, 27 insertions(+), 41 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index bc6b006afa..9370118d70 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -46,78 +46,63 @@ float getAmbientClamp() return 1.0f; } - void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) { - vec3 P = inPositionEye; + vec3 rel_pos = inPositionEye; //(TERRAIN) limit altitude - if (P.y > max_y) P *= ( max_y / P.y); - if (P.y < -max_y) P *= (-max_y / P.y); - - vec3 tmpLightnorm = lightnorm.xyz; + rel_pos.y = clamp(rel_pos.y, -max_y, max_y); - vec3 Pn = normalize(P); - float Plen = length(P); - - vec4 temp1 = vec4(0); - vec3 temp2 = vec3(0); - vec4 blue_weight; - vec4 haze_weight; + vec3 rel_pos_norm = normalize(rel_pos); + float rel_pos_len = length(rel_pos); vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; - vec4 light_atten; - - float dens_mul = density_multiplier; - float dist_mul = distance_multiplier; //sunlight attenuation effect (hue and brightness) due to atmosphere //this is used later for sunlight modulation at various altitudes - light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); + vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); //I had thought blue_density and haze_density should have equal weighting, //but attenuation due to haze_density tends to seem too strong - temp1 = blue_density + vec4(haze_density); - blue_weight = blue_density / temp1; - haze_weight = vec4(haze_density) / temp1; + vec4 combined_haze = blue_density + vec4(haze_density); + vec4 blue_weight = blue_density / combined_haze; + vec4 haze_weight = vec4(haze_density) / combined_haze; //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain) - float above_horizon_angle = abs(tmpLightnorm.z); + float above_horizon_angle = abs(lightnorm.z); sunlight *= exp(-light_atten * above_horizon_angle); // for atten and angle in [0..1], this maps to something like [0.3..1] // main atmospheric scattering line integral - temp2.z = Plen * dens_mul; + float density_dist = rel_pos_len * density_multiplier; - // Transparency (-> temp1) - // ATI Bugfix -- can't store temp1*temp2.z*dist_mul in a variable because the ati + // Transparency (-> combined_haze) + // ATI Bugfix -- can't store combined_haze*density_dist*distance_multiplier in a variable because the ati // compiler gets confused. - temp1 = exp(-temp1 * temp2.z * dist_mul); + combined_haze = exp(-combined_haze * density_dist * distance_multiplier); //final atmosphere attenuation factor - atten = temp1.rgb; + atten = combined_haze.rgb; //compute haze glow - //(can use temp2.x as temp because we haven't used it yet) - temp2.x = dot(Pn, tmpLightnorm.xyz); + float haze_glow = dot(rel_pos_norm, lightnorm.xyz); // dampen sun additive contrib when not facing it... // SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees. // if (length(light_dir) > 0.01) - { - temp2.x *= max(0.0f, dot(light_dir, Pn)); - } - temp2.x = 1. - temp2.x; - //temp2.x is 0 at the sun and increases away from sun - temp2.x = max(temp2.x, .001); //was glow.y + haze_glow *= max(0.0f, dot(light_dir, rel_pos_norm)); + + haze_glow = 1. - haze_glow; + //haze_glow is 0 at the sun and increases away from sun + haze_glow = max(haze_glow, .001); //was glow.y //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) - temp2.x *= glow.x; + haze_glow *= glow.x; //higher glow.x gives dimmer glow (because next step is 1 / "angle") - temp2.x = pow(temp2.x, glow.z); + haze_glow = pow(haze_glow, glow.z); //glow.z should be negative, so we're doing a sort of (1 / "angle") function //add "minimum anti-solar illumination" - temp2.x += .25; + haze_glow += .25; - temp2.x *= sun_moon_glow_factor; + haze_glow *= sun_moon_glow_factor; vec4 amb_color = ambient_color; @@ -143,10 +128,11 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou //haze color vec3 cs = sunlight.rgb * (1.-cloud_shadow); additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) - + (haze_horizon * haze_weight.rgb) * (cs * temp2.x + tmpAmbient.rgb); + + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb); //brightness of surface both sunlight and ambient sunlit = sunlight.rgb * 0.5; amblit = tmpAmbient.rgb * .25; - additive *= vec3(1.0 - temp1); + additive *= vec3(1.0 - combined_haze); } + -- cgit v1.2.3 From a027e8d4813c839babe2163943e46bf7f93fa005 Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Tue, 1 Sep 2020 14:23:39 -0600 Subject: SL-12978 clang-format shader file (whitespace) --- .../class1/windlight/atmosphericsFuncs.glsl | 104 ++++++++++----------- 1 file changed, 50 insertions(+), 54 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 9370118d70..9c50453898 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -1,75 +1,73 @@ -/** +/** * @file class1\windlight\atmosphericsFuncs.glsl * * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2019, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ -uniform vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 moonlight_color; +uniform int sun_up_factor; +uniform vec4 ambient_color; +uniform vec4 blue_horizon; +uniform vec4 blue_density; uniform float haze_horizon; uniform float haze_density; uniform float cloud_shadow; uniform float density_multiplier; uniform float distance_multiplier; uniform float max_y; -uniform vec4 glow; +uniform vec4 glow; uniform float scene_light_strength; -uniform mat3 ssao_effect_mat; -uniform int no_atmo; +uniform mat3 ssao_effect_mat; +uniform int no_atmo; uniform float sun_moon_glow_factor; -float getAmbientClamp() -{ - return 1.0f; -} +float getAmbientClamp() { return 1.0f; } -void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, + out vec3 atten, bool use_ao) { vec3 rel_pos = inPositionEye; - + //(TERRAIN) limit altitude rel_pos.y = clamp(rel_pos.y, -max_y, max_y); - vec3 rel_pos_norm = normalize(rel_pos); - float rel_pos_len = length(rel_pos); - vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; + vec3 rel_pos_norm = normalize(rel_pos); + float rel_pos_len = length(rel_pos); + vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; - //sunlight attenuation effect (hue and brightness) due to atmosphere - //this is used later for sunlight modulation at various altitudes + // sunlight attenuation effect (hue and brightness) due to atmosphere + // this is used later for sunlight modulation at various altitudes vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); - //I had thought blue_density and haze_density should have equal weighting, - //but attenuation due to haze_density tends to seem too strong + // I had thought blue_density and haze_density should have equal weighting, + // but attenuation due to haze_density tends to seem too strong vec4 combined_haze = blue_density + vec4(haze_density); - vec4 blue_weight = blue_density / combined_haze; - vec4 haze_weight = vec4(haze_density) / combined_haze; + vec4 blue_weight = blue_density / combined_haze; + vec4 haze_weight = vec4(haze_density) / combined_haze; //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain) float above_horizon_angle = abs(lightnorm.z); - sunlight *= exp(-light_atten * above_horizon_angle); // for atten and angle in [0..1], this maps to something like [0.3..1] + sunlight *= exp(-light_atten * above_horizon_angle); // for atten and angle in [0..1], this maps to something like [0.3..1] // main atmospheric scattering line integral float density_dist = rel_pos_len * density_multiplier; @@ -79,43 +77,43 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou // compiler gets confused. combined_haze = exp(-combined_haze * density_dist * distance_multiplier); - //final atmosphere attenuation factor + // final atmosphere attenuation factor atten = combined_haze.rgb; - - //compute haze glow + + // compute haze glow float haze_glow = dot(rel_pos_norm, lightnorm.xyz); // dampen sun additive contrib when not facing it... - // SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees. + // SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees. // if (length(light_dir) > 0.01) haze_glow *= max(0.0f, dot(light_dir, rel_pos_norm)); - + haze_glow = 1. - haze_glow; - //haze_glow is 0 at the sun and increases away from sun - haze_glow = max(haze_glow, .001); //was glow.y - //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + // haze_glow is 0 at the sun and increases away from sun + haze_glow = max(haze_glow, .001); // set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) haze_glow *= glow.x; - //higher glow.x gives dimmer glow (because next step is 1 / "angle") + // higher glow.x gives dimmer glow (because next step is 1 / "angle") haze_glow = pow(haze_glow, glow.z); - //glow.z should be negative, so we're doing a sort of (1 / "angle") function + // glow.z should be negative, so we're doing a sort of (1 / "angle") function - //add "minimum anti-solar illumination" + // add "minimum anti-solar illumination" haze_glow += .25; haze_glow *= sun_moon_glow_factor; - - vec4 amb_color = ambient_color; - - //increase ambient when there are more clouds + + vec4 amb_color = ambient_color; + + // increase ambient when there are more clouds vec4 tmpAmbient = amb_color + (vec4(1.) - amb_color) * cloud_shadow * 0.5; - + /* decrease value and saturation (that in HSV, not HSL) for occluded areas * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html * // The following line of code performs the equivalent of: * float ambAlpha = tmpAmbient.a; * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); - * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); + * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, + * ambAlpha); */ if (use_ao) { @@ -125,14 +123,12 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou // Similar/Shared Algorithms: // indra\llinventory\llsettingssky.cpp -- LLSettingsSky::calculateLightSettings() // indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars() - //haze color - vec3 cs = sunlight.rgb * (1.-cloud_shadow); - additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) - + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb); + // haze color + vec3 cs = sunlight.rgb * (1. - cloud_shadow); + additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb); - //brightness of surface both sunlight and ambient + // brightness of surface both sunlight and ambient sunlit = sunlight.rgb * 0.5; amblit = tmpAmbient.rgb * .25; additive *= vec3(1.0 - combined_haze); } - -- cgit v1.2.3 From 267e8fd9a383e333be8d7a0a289523f47bba4fac Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Wed, 2 Sep 2020 11:33:40 -0600 Subject: SL-12978 & SL-13743. Remove abrupt changes in sun intensity calc, preserve original fall-off. Had to find a balance in the sunlight intensity calculation that behaves correctly for both these issues. --- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 9c50453898..05e6e6a9f9 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -65,9 +65,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou vec4 blue_weight = blue_density / combined_haze; vec4 haze_weight = vec4(haze_density) / combined_haze; - //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain) - float above_horizon_angle = abs(lightnorm.z); - sunlight *= exp(-light_atten * above_horizon_angle); // for atten and angle in [0..1], this maps to something like [0.3..1] + //(TERRAIN) compute sunlight from lightnorm y component. Factor is roughly cosecant(sun elevation) (for short rays like terrain) + float above_horizon_factor = 1.0 / max(1e-6, lightnorm.y); + sunlight *= exp(-light_atten * above_horizon_factor); // for sun [horizon..overhead] this maps to an exp curve [0..1] // main atmospheric scattering line integral float density_dist = rel_pos_len * density_multiplier; -- cgit v1.2.3 From f677b4187b1c8b4e6633bc8a39ef4cc9ca7577bf Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Fri, 11 Sep 2020 19:07:14 -0700 Subject: SL-13465 Remove hack offset of moon when AS is ON to match when AS is OFF. --- indra/newview/app_settings/shaders/class1/windlight/moonV.glsl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl index 8cd4b2ef47..c4cdd06e28 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl @@ -37,8 +37,7 @@ VARYING vec2 vary_texcoord0; void main() { //transform vertex - vec3 offset = vec3(0, 0, 50); - vec4 vert = vec4(position.xyz - offset, 1.0); + vec4 vert = vec4(position.xyz, 1.0); vec4 pos = (modelview_matrix * vert); gl_Position = modelview_projection_matrix*vert; -- cgit v1.2.3 From 874d7e7e02e3bfbabbac1b31e94ad848ee854367 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Fri, 11 Sep 2020 20:46:55 -0700 Subject: SL-13465 Restore Pre-EEP haze effecting moon --- .../shaders/class1/windlight/moonF.glsl | 35 +++++++++------------- .../shaders/class1/windlight/moonV.glsl | 6 +--- 2 files changed, 15 insertions(+), 26 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl index 72d2c4cdfa..2425a2ad04 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl @@ -3,7 +3,7 @@ * * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. + * Copyright (C) 2005, 2020 Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -36,37 +36,30 @@ out vec4 frag_color; uniform vec4 color; uniform vec4 sunlight_color; uniform vec4 moonlight_color; -uniform vec3 lumWeights; +uniform vec3 moon_dir; uniform float moon_brightness; -uniform float minLuminance; uniform sampler2D diffuseMap; -uniform sampler2D altDiffuseMap; -uniform float blend_factor; // interp factor between moon A/B + VARYING vec2 vary_texcoord0; -vec3 getAdditiveColor(); vec3 scaleSoftClip(vec3 light); void main() { - vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy); - vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy); - vec4 c = mix(moonA, moonB, blend_factor); - - // mix factor which blends when sunlight is brighter - // and shows true moon color at night - vec3 luma_weights = vec3(0.3, 0.5, 0.3); - float blend = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights); + // Restore Pre-EEP alpha fade moon near horizon + float fade = 1.0; + if( moon_dir.z > 0 ) + fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 ); - vec3 exp = vec3(1.0 - blend * moon_brightness) * 2.0 - 1.0; - c.rgb = pow(c.rgb, exp); - //c.rgb *= moonlight_color.rgb; + vec4 c = texture2D(diffuseMap, vary_texcoord0.xy); +// c.rgb = pow(c.rgb, vec3(0.7f)); // can't use "srgb_to_linear(color.rgb)" as that is a deferred only function + c.rgb *= moonlight_color.rgb; + c.rgb *= moon_brightness; - // Partial atmospherics calculation - vec3 ac = getAdditiveColor(); - c.rgb += ac; + c.rgb *= fade; + c.a *= fade; - c.rgb = scaleSoftClip(c.rgb); + c.rgb = scaleSoftClip(c.rgb); frag_color = vec4(c.rgb, c.a); } diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl index c4cdd06e28..2fceb5f743 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl @@ -3,7 +3,7 @@ * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. + * Copyright (C) 2007, 2020 Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,8 +30,6 @@ uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; ATTRIBUTE vec2 texcoord0; -void calcAtmospherics(vec3 inPositionEye); - VARYING vec2 vary_texcoord0; void main() @@ -43,6 +41,4 @@ void main() gl_Position = modelview_projection_matrix*vert; vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - - calcAtmospherics(pos.xyz); } -- cgit v1.2.3 From e8f4017b910ae6276772f540eef80ac0c788cb57 Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Wed, 16 Sep 2020 17:11:01 -0600 Subject: DRTVWR-4976 Misc shader cleanup. Removed some potential div-by-0 NaNs and a mangled clamp. --- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1/windlight') diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 05e6e6a9f9..ea2690ba09 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -49,7 +49,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou vec3 rel_pos = inPositionEye; //(TERRAIN) limit altitude - rel_pos.y = clamp(rel_pos.y, -max_y, max_y); + if (abs(rel_pos.y) > max_y) rel_pos *= (max_y / rel_pos.y); vec3 rel_pos_norm = normalize(rel_pos); float rel_pos_len = length(rel_pos); -- cgit v1.2.3