diff options
| author | Jonathan "Geenz" Goodman <geenz@lindenlab.com> | 2025-02-07 05:55:47 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-07 05:55:47 -0500 | 
| commit | 93a88e602545828c0298b20ff0375f191d1f6d9a (patch) | |
| tree | cb098bfa5eeb4b0d784a9ed6aec3b5fe7f1a0245 /indra/newview/app_settings/shaders/class3/environment | |
| parent | 317cd6e66e65256eda6441c06fa32e55eee99fa3 (diff) | |
Water Exclusion Surfaces (#3517)
* #3455 Add support for water exclusion surfaces
Diffstat (limited to 'indra/newview/app_settings/shaders/class3/environment')
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl | 8 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/environment/waterF.glsl | 13 | 
2 files changed, 15 insertions, 6 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl index 1c02dc764d..fa410e9f11 100644 --- a/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl @@ -26,6 +26,7 @@  out vec4 frag_color;  uniform sampler2D bumpMap; +uniform sampler2D exclusionTex;  #ifdef TRANSPARENT_WATER  uniform sampler2D screenTex; @@ -59,6 +60,9 @@ void mirrorClip(vec3 position);  void main()  {      mirrorClip(vary_position); +    vec2 screen_tc = (refCoord.xy/refCoord.z) * 0.5 + 0.5; +    float water_mask = texture(exclusionTex, screen_tc).r; +      vec4 color;      //get detail normals @@ -68,8 +72,8 @@ void main()      vec3 wavef = normalize(wave1+wave2+wave3);      //figure out distortion vector (ripply) -    vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5; -    distort = distort+wavef.xy*refScale; +    vec2 distort = screen_tc; +    distort = mix(distort, distort+wavef.xy*refScale, water_mask);  #ifdef TRANSPARENT_WATER      vec4 fb = texture(screenTex, distort); diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl index f8aa684433..7027e3796e 100644 --- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl @@ -88,7 +88,7 @@ uniform sampler2D screenTex;  uniform sampler2D depthMap;  #endif -uniform sampler2D refTex; +uniform sampler2D exclusionTex;  uniform float sunAngle;  uniform float sunAngle2; @@ -252,6 +252,8 @@ void main()      float shadow = 1.0f; +    float water_mask = texture(exclusionTex, distort).r; +  #ifdef HAS_SUN_SHADOW      shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, distort);  #endif @@ -266,9 +268,8 @@ void main()      vec3 refPos = getPositionWithNDC(vec3(distort*2.0-vec2(1.0), depth*2.0-1.0));      // Calculate some distance fade in the water to better assist with refraction blending and reducing the refraction texture's "disconnect". -    fade = max(0,min(1, (pos.z - refPos.z) / 10)); +    fade = max(0,min(1, (pos.z - refPos.z) / 10)) * water_mask;      distort2 = mix(distort, distort2, min(1, fade * 10)); -      depth = texture(depthMap, distort2).r;      refPos = getPositionWithNDC(vec3(distort2 * 2.0 - vec2(1.0), depth * 2.0 - 1.0)); @@ -282,6 +283,9 @@ void main()  #else      vec4 fb = applyWaterFogViewLinear(viewVec*2048.0, vec4(1.0)); + +    if (water_mask < 1) +        discard;  #endif      float metallic = 1.0; @@ -333,6 +337,7 @@ void main()      color = mix(fb.rgb, color, fade);      float spec = min(max(max(punctual.r, punctual.g), punctual.b), 0.05); -    frag_color = min(vec4(1),max(vec4(color.rgb, spec), vec4(0))); + +    frag_color = min(vec4(1),max(vec4(color.rgb, spec * water_mask), vec4(0)));  } | 
