diff options
5 files changed, 48 insertions, 27 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 1de8b25a7d..8b2a69b924 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -35,19 +35,19 @@ in vec3 vary_position;  in vec4 vertex_color;  in vec2 vary_texcoord0; -vec4 applyWaterFogViewLinear(vec3 pos, vec4 color); -  vec3 srgb_to_linear(vec3 cs);  vec3 linear_to_srgb(vec3 cl); -vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten); -void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);  #ifdef HAS_ALPHA_MASK  uniform float minimum_alpha;  #endif  #ifdef IS_ALPHA +uniform vec4 waterPlane;  void waterClip(vec3 pos); +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, +                         out vec3 atten); +vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color);  #endif  void main()  @@ -77,21 +77,20 @@ void main()      vec3 pos = vary_position;  #ifndef IS_HUD +    color.rgb = srgb_to_linear(color.rgb); +    color.a = final_alpha; +#ifdef IS_ALPHA +      vec3 sunlit;      vec3 amblit;      vec3 additive;      vec3 atten;      calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten); -    color.rgb = srgb_to_linear(color.rgb); - -#ifdef IS_ALPHA -    color.rgb = atmosFragLighting(color.rgb, additive, atten); +    color.rgb = applySkyAndWaterFog(pos, additive, atten, color).rgb; +      #endif -    vec4 fogged = applyWaterFogViewLinear(pos, vec4(color.rgb, final_alpha)); -    color.rgb = fogged.rgb; -    color.a   = fogged.a;  #endif      frag_color = max(color, vec4(0)); diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl index 140e01cc2a..f796bb5f3f 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl @@ -33,6 +33,8 @@ uniform float waterFogKS;  vec3 srgb_to_linear(vec3 col);  vec3 linear_to_srgb(vec3 col); +vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten); +  // get a water fog color that will apply the appropriate haze to a color given  // a blend function of (ONE, SOURCE_ALPHA)  vec4 getWaterFogViewNoClip(vec3 pos) @@ -108,3 +110,35 @@ vec4 applyWaterFogViewLinear(vec3 pos, vec4 color)      return applyWaterFogViewLinearNoClip(pos, color);  } +// for post deferred shaders, apply sky and water fog in a way that is consistent with +// the deferred rendering haze post effects +vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color) +{ +    bool eye_above_water = dot(vec3(0), waterPlane.xyz) + waterPlane.w > 0.0; +    bool obj_above_water = dot(pos.xyz, waterPlane.xyz) + waterPlane.w > 0.0; + +    if (eye_above_water) +    { +        if (!obj_above_water) +        {  +            color.rgb = applyWaterFogViewLinearNoClip(pos, color).rgb; +        } +        else +        { +            color.rgb = atmosFragLighting(color.rgb, additive, atten); +        } +    } +    else +    { +        if (obj_above_water) +        { +            color.rgb = atmosFragLighting(color.rgb, additive, atten); +        } +        else +        { +            color.rgb = applyWaterFogViewLinearNoClip(pos, color).rgb; +        } +    } + +    return color; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 07fa5cd01c..acd32a81b3 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -65,14 +65,11 @@ uniform vec3 light_diffuse[8];  void waterClip(vec3 pos); -vec4 applyWaterFogViewLinear(vec3 pos, vec4 color); -  vec3 srgb_to_linear(vec3 c);  vec3 linear_to_srgb(vec3 c);  vec2 encode_normal (vec3 n); -vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); - +vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive);  #ifdef HAS_SUN_SHADOW @@ -283,9 +280,7 @@ void main()      // sum local light contrib in linear colorspace      color.rgb += light.rgb; -    color.rgb = atmosFragLightingLinear(color.rgb, additive, atten); - -    color = applyWaterFogViewLinear(pos.xyz, color); +    color.rgb = applySkyAndWaterFog(pos.xyz, additive, atten, color).rgb;  #endif // #else // FOR_IMPOSTOR diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl index 6446015b03..8430cca325 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl @@ -85,8 +85,6 @@ void main()      color.rgb = srgb_to_linear(color.rgb);      applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity); -    color.rgb = atmosFragLighting(color.rgb, additive, atten); -    color = applyWaterFogViewLinear(pos.xyz, color);  #endif  	color.a = 1.0; diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index 1880f0c870..ec1e49eeb4 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -37,9 +37,7 @@  uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise  uniform int sun_up_factor; -vec4 applyWaterFogViewLinear(vec3 pos, vec4 color); - -vec3 atmosFragLightingLinear(vec3 l, vec3 additive, vec3 atten); +vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color);  vec3 scaleSoftClipFragLinear(vec3 l);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive);  void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist); @@ -399,10 +397,7 @@ void main()      color += light; -    color.rgb = atmosFragLightingLinear(color.rgb, additive, atten);  - -    vec4 temp = applyWaterFogViewLinear(pos, vec4(color, 0.0)); -    color = temp.rgb; +    color.rgb = applySkyAndWaterFog(pos.xyz, additive, atten, vec4(color, 1.0)).rgb;      glare *= 1.0-emissive;      glare = min(glare, 1.0);  | 
