diff options
| author | RunitaiLinden <davep@lindenlab.com> | 2023-12-04 16:50:06 -0600 | 
|---|---|---|
| committer | RunitaiLinden <davep@lindenlab.com> | 2023-12-04 16:50:06 -0600 | 
| commit | 6472b75bcd70470fe5775d1cf6eb70a75b3d76e5 (patch) | |
| tree | 4fae5abd39b9af7bad0f6ed55b651d87fa3bfc3b /indra/newview/app_settings/shaders/class1 | |
| parent | c573d27e5baf23adbc14153c4d65a581f55febb4 (diff) | |
SL-20611 Followup -- fix edge cases with transparent objects around eye/object above/below water.
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl | 21 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl | 34 | 
2 files changed, 44 insertions, 11 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; +}  | 
