summaryrefslogtreecommitdiff
path: root/indra/newview/app_settings/shaders/class1
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl34
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;
+}