diff options
| author | Rye Mutt <rye@alchemyviewer.org> | 2021-01-13 18:26:13 -0500 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-09-30 21:50:48 +0300 | 
| commit | 994d432e6655d2ed8c45c0d0e804629cb0f650c5 (patch) | |
| tree | 03a751b01c5f9cd117b5e426b690d5d18b532e59 /indra/newview/app_settings/shaders/class1/deferred | |
| parent | 9104b899961a9ceb61de73528e85f1a240f30cb5 (diff) | |
Port required changes to render rainbows and sun dogs to class1 deferred sky shader and remove redundant and slow class2 version.
# Conflicts:
#	indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/deferred')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/skyF.glsl | 43 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/skyV.glsl | 35 | 
2 files changed, 56 insertions, 22 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index 331249dc33..9772063f03 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -25,6 +25,17 @@  /*[EXTRA_CODE_HERE]*/ +// Inputs +VARYING vec4 vary_HazeColor; +VARYING float vary_LightNormPosDot; + +uniform sampler2D rainbow_map; +uniform sampler2D halo_map; + +uniform float moisture_level; +uniform float droplet_radius; +uniform float ice_level; +  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_data[3];  #else @@ -35,11 +46,27 @@ out vec4 frag_data[3];  // The fragment shader for the sky  ///////////////////////////////////////////////////////////////////////// -VARYING vec4 vary_HazeColor; +vec3 rainbow(float d) +{ +    // 'Interesting' values of d are -0.75 .. -0.825, i.e. when view vec nearly opposite of sun vec +    // Rainbox tex is mapped with REPEAT, so -.75 as tex coord is same as 0.25.  -0.825 -> 0.175. etc. +    // SL-13629 +    // Unfortunately the texture is inverted, so we need to invert the y coord, but keep the 'interesting' +    // part within the same 0.175..0.250 range, i.e. d = (1 - d) - 1.575 +    d         = clamp(-0.575 - d, 0.0, 1.0); +    float rad = (droplet_radius - 5.0f) / 1024.0f; +    return pow(texture2D(rainbow_map, vec2(rad+0.5, d)).rgb, vec3(1.8)) * moisture_level; +} + +vec3 halo22(float d) +{ +    d       = clamp(d, 0.1, 1.0); +    float v = sqrt(clamp(1 - (d * d), 0, 1)); +    return texture2D(halo_map, vec2(0, v)).rgb * ice_level; +}  /// Soft clips the light with a gamma correction  vec3 scaleSoftClip(vec3 light); -vec3 srgb_to_linear(vec3 c);  void main()  { @@ -48,14 +75,18 @@ void main()      // the fragment) if the sky wouldn't show up because the clouds       // are fully opaque. -    vec4 color; -    color = vary_HazeColor; +    vec4 color = vary_HazeColor; +    float  rel_pos_lightnorm = vary_LightNormPosDot; +    float optic_d = rel_pos_lightnorm; +    vec3  halo_22 = halo22(optic_d); +    color.rgb += rainbow(optic_d); +    color.rgb += halo_22;      color.rgb *= 2.;      color.rgb = scaleSoftClip(color.rgb); -    /// Gamma correct for WL (soft clip effect). -    frag_data[0] = vec4(color.rgb, 0.0); +    // Gamma correct for WL (soft clip effect). +    frag_data[0] = vec4(color.rgb, 1.0);      frag_data[1] = vec4(0.0,0.0,0.0,0.0);      frag_data[2] = vec4(0.0,0.0,0.0,1.0); //1.0 in norm.w masks off fog diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl index 28a1faf24f..6db4690bff 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -33,6 +33,7 @@ ATTRIBUTE vec3 position;  // Output parameters  VARYING vec4 vary_HazeColor; +VARYING float vary_LightNormPosDot;  // Inputs  uniform vec3 camPosLocal; @@ -72,27 +73,29 @@ void main()      vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);      // Adj position vector to clamp altitude -    if (rel_pos.y > 0) +    if (rel_pos.y > 0.)      {          rel_pos *= (max_y / rel_pos.y);      } -    if (rel_pos.y < 0) +    if (rel_pos.y < 0.)      {          rel_pos *= (-32000. / rel_pos.y);      } -    // Can normalize then -    vec3 rel_pos_norm = normalize(rel_pos); +    // Normalized +    vec3  rel_pos_norm = normalize(rel_pos); +    float rel_pos_len  = length(rel_pos); -    float rel_pos_len = length(rel_pos); +    // Grab this value and pass to frag shader for rainbows +    float rel_pos_lightnorm_dot = dot(rel_pos_norm, lightnorm.xyz); +    vary_LightNormPosDot = rel_pos_lightnorm_dot;      // Initialize temp variables      vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -    vec4 light_atten;      // 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)) * (density_multiplier * max_y); +    vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);      // Calculate relative weights      vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density)); @@ -112,7 +115,7 @@ void main()      combined_haze = exp(-combined_haze * density_dist);      // Compute haze glow -    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); +    float haze_glow = 1.0 - rel_pos_lightnorm_dot;      // 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) @@ -123,30 +126,30 @@ void main()      // Add "minimum anti-solar illumination"      // For sun, add to glow.  For moon, remove glow entirely. SL-13768 -    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); +    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25)); -    vec4 color = -        (blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)); +    // Haze color above cloud +    vec4 color = (blue_horizon * blue_weight * (sunlight + ambient_color) +               + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));      // Final atmosphere additive      color *= (1. - combined_haze);      // Increase ambient when there are more clouds -    vec4 tmpAmbient = ambient_color; -    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; +    vec4 ambient = ambient_color + max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;      // Dim sunlight by cloud shadow percentage      sunlight *= max(0.0, (1. - cloud_shadow));      // Haze color below cloud -    vec4 additiveColorBelowCloud = -        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); +    vec4 add_below_cloud = (blue_horizon * blue_weight * (sunlight + ambient)  +                         + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient));      // Attenuate cloud color by atmosphere      combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds      // At horizon, blend high altitude sky color towards the darker color below the clouds -    color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze)); +    color += (add_below_cloud - color) * (1. - sqrt(combined_haze));      // Haze color above cloud      vary_HazeColor = color; | 
