diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class3')
12 files changed, 130 insertions, 58 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl index 8430cca325..c382a9fbc0 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl @@ -53,8 +53,11 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout  void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); +void mirrorClip(vec3 pos); +  void main()  { +    mirrorClip(vary_position);  #ifdef HAS_DIFFUSE_LOOKUP  	vec4 color = diffuseLookup(vary_texcoord0.xy);  #else diff --git a/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl index 0b154e82ad..4af57e3b80 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl @@ -33,7 +33,7 @@ uniform vec3 moon_dir;  uniform int  sun_up_factor;  in vec2 vary_fragcoord; -vec3 getNorm(vec2 pos_screen); +vec4 getNorm(vec2 pos_screen);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); @@ -53,8 +53,7 @@ void main()      vec2  tc           = vary_fragcoord.xy;      float depth        = getDepth(tc.xy);      vec4  pos          = getPositionWithDepth(tc, depth); -    vec4  norm         = texture(normalMap, tc); -    norm.xyz           = getNorm(tc); +    vec4  norm         = getNorm(tc);      vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;      vec3  color = vec3(0); diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index ec1e49eeb4..2a20eb79d2 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -45,6 +45,13 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float  vec3 srgb_to_linear(vec3 cs);  vec3 linear_to_srgb(vec3 cs); +uniform mat4 modelview_matrix; +uniform mat3 normal_matrix; + +in vec3 vary_position; + +void mirrorClip(vec3 pos); +  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)  out vec4 frag_color; @@ -66,12 +73,12 @@ uniform vec4 morphFactor;  uniform vec3 camPosLocal;  uniform mat3 env_mat; +uniform float is_mirror; +  uniform vec3 sun_dir;  uniform vec3 moon_dir;  in vec2 vary_fragcoord; -in vec3 vary_position; -  uniform mat4 proj_mat;  uniform mat4 inv_proj;  uniform vec2 screen_res; @@ -209,8 +216,6 @@ in vec3 vary_normal;  in vec4 vertex_color;  in vec2 vary_texcoord0; -vec2 encode_normal(vec3 n); -  // get the transformed normal and apply glossiness component from normal map  vec3 getNormal(inout float glossiness)  { @@ -285,12 +290,12 @@ float getShadow(vec3 pos, vec3 norm)  void main()  { +    mirrorClip(vary_position);      waterClip();      // diffcol == diffuse map combined with vertex color      vec4 diffcol = texture(diffuseMap, vary_texcoord0.xy);  	diffcol.rgb *= vertex_color.rgb; -      alphaMask(diffcol.a);      // spec == specular map combined with specular color @@ -299,8 +304,6 @@ void main()      float glossiness = specular_color.a;      vec3 norm = getNormal(glossiness); -    vec2 abnormal = encode_normal(norm.xyz); -      float emissive = getEmissive(diffcol);  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) @@ -407,10 +410,15 @@ void main()  #else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer       // deferred path               // See: C++: addDeferredAttachment(), shader: softenLightF.glsl -    frag_data[0] = vec4(diffcol.rgb, emissive);        // gbuffer is sRGB for legacy materials -    frag_data[1] = vec4(spec.rgb, glossiness);           // XYZ = Specular color. W = Specular exponent. -    frag_data[2] = vec4(encode_normal(norm), env, GBUFFER_FLAG_HAS_ATMOS);;   // XY = Normal.  Z = Env. intensity. W = 1 skip atmos (mask off fog) -    frag_data[3] = vec4(0); + +    float flag = GBUFFER_FLAG_HAS_ATMOS; + +    frag_data[0] = max(vec4(diffcol.rgb, emissive), vec4(0));        // gbuffer is sRGB for legacy materials +    frag_data[1] = max(vec4(spec.rgb, glossiness), vec4(0));           // XYZ = Specular color. W = Specular exponent. +    frag_data[2] = vec4(norm, flag);   // XY = Normal.  Z = Env. intensity. W = 1 skip atmos (mask off fog) +    frag_data[3] = vec4(env, 0, 0, 0); +  #endif  } + diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl index ec8168465e..edfd6cbced 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl @@ -48,7 +48,7 @@ in vec4 vary_fragcoord;  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);  float calcLegacyDistanceAttenuation(float distance, float falloff);  vec4 getPosition(vec2 pos_screen); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity); +vec4 getNorm(vec2 screenpos);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 c); @@ -74,9 +74,8 @@ void main()          discard;      } -    float envIntensity; // not used for this shader -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNorm(tc); // need `norm.w` for GET_GBUFFER_FLAG() +    vec3 n = norm.xyz;      vec4 spec    = texture(specularRect, tc);      vec3 diffuse = texture(diffuseRect, tc).rgb; diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl index 31af1208bd..60be9f4407 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl @@ -52,7 +52,7 @@ uniform vec4 viewport;  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);  float calcLegacyDistanceAttenuation(float distance, float falloff); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity); +vec4 getNorm(vec2 screenpos);  vec4 getPosition(vec2 pos_screen);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip); @@ -72,9 +72,8 @@ void main()      vec2 tc          = getScreenCoord(vary_fragcoord);      vec3 pos         = getPosition(tc).xyz; -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNorm(tc); // need `norm.w` for GET_GBUFFER_FLAG() +    vec3 n = norm.xyz;      vec3 diffuse = texture(diffuseRect, tc).rgb;      vec4 spec    = texture(specularRect, tc); diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 906e66ecc8..90c84cc428 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -31,6 +31,7 @@ float tapScreenSpaceReflection(int totalSamples, vec2 tc, vec3 viewPos, vec3 n,  uniform samplerCubeArray   reflectionProbes;  uniform samplerCubeArray   irradianceProbes; +  uniform sampler2D sceneMap;  uniform int cube_snapshot;  uniform float max_probe_lod; @@ -47,6 +48,7 @@ layout (std140) uniform ReflectionProbes      /// box[0..2] - plane 0 .. 2 in [A,B,C,D] notation      //  box[3][0..2] - plane thickness      mat4 refBox[MAX_REFMAP_COUNT]; +    mat4 heroBox;      // list of bounding spheres for reflection probes sorted by distance to camera (closest first)      vec4 refSphere[MAX_REFMAP_COUNT];      // extra parameters  @@ -55,6 +57,7 @@ layout (std140) uniform ReflectionProbes      //  z - fade in      //  w - znear      vec4 refParams[MAX_REFMAP_COUNT]; +    vec4 heroSphere;      // index  of cube map in reflectionProbes for a corresponding reflection probe      // e.g. cube map channel of refSphere[2] is stored in refIndex[2]      // refIndex.x - cubemap channel in reflectionProbes @@ -70,6 +73,10 @@ layout (std140) uniform ReflectionProbes      // number of reflection probes present in refSphere      int refmapCount; + +    int heroShape; +    int heroMipCount; +    int heroProbeCount;  };  // Inputs @@ -365,11 +372,11 @@ return texCUBE(envMap, ReflDirectionWS);  // i - probe index in refBox/refSphere  // d - distance to nearest wall in clip space  // scale - scale of box, default 1.0 -vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d, float scale) +vec3 boxIntersect(vec3 origin, vec3 dir, mat4 i, out float d, float scale)  {      // Intersection with OBB convert to unit box space      // Transform in local unit parallax cube space (scaled and rotated) -    mat4 clipToLocal = refBox[i]; +    mat4 clipToLocal = i;      vec3 RayLS = mat3(clipToLocal) * dir;      vec3 PositionLS = (clipToLocal * vec4(origin, 1.0)).xyz; @@ -388,7 +395,7 @@ vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d, float scale)      return IntersectPositionCS;  } -vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d) +vec3 boxIntersect(vec3 origin, vec3 dir, mat4 i, out float d)  {      return boxIntersect(origin, dir, i, d, 1.0);  } @@ -443,9 +450,9 @@ void boxIntersectionDebug( in vec3 ro, in vec3 p, vec3 boxSize, inout vec4 col)  } -void boxIntersectDebug(vec3 origin, vec3 pos, int i, inout vec4 col) +void boxIntersectDebug(vec3 origin, vec3 pos, mat4 i, inout vec4 col)  { -    mat4 clipToLocal = refBox[i]; +    mat4 clipToLocal = i;      // transform into unit cube space      origin = (clipToLocal * vec4(origin, 1.0)).xyz; @@ -462,7 +469,7 @@ void boxIntersectDebug(vec3 origin, vec3 pos, int i, inout vec4 col)  //  r - radius of probe influence volume  // i - index of probe in refSphere  // dw - distance weight -float sphereWeight(vec3 pos, vec3 dir, vec3 origin, float r, int i, out float dw) +float sphereWeight(vec3 pos, vec3 dir, vec3 origin, float r, vec4 i, out float dw)  {      float r1 = r * 0.5; // 50% of radius (outer sphere to start interpolating down)       vec3 delta = pos.xyz - origin; @@ -471,7 +478,7 @@ float sphereWeight(vec3 pos, vec3 dir, vec3 origin, float r, int i, out float dw      float atten = 1.0 - max(d2 - r1, 0.0) / max((r - r1), 0.001);      float w = 1.0 / d2; -    w *= refParams[i].z; +    w *= i.z;      dw = w * atten * max(r, 1.0)*4; @@ -497,7 +504,7 @@ vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, float lod, vec3 c,      if (refIndex[i].w < 0)      {  // box probe          float d = 0; -        v = boxIntersect(pos, dir, i, d); +        v = boxIntersect(pos, dir, refBox[i], d);          w = max(d, 0.001);      } @@ -511,7 +518,7 @@ vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, float lod, vec3 c,          refIndex[i].w < 1 ? 4096.0*4096.0 : // <== effectively disable parallax correction for automatically placed probes to keep from bombing the world with obvious spheres                  rr); -        w = sphereWeight(pos, dir, refSphere[i].xyz, r, i, dw); +        w = sphereWeight(pos, dir, refSphere[i].xyz, r, refParams[i], dw);      }      v -= c; @@ -537,7 +544,7 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int      if (refIndex[i].w < 0)      {          float d = 0.0; -        v = boxIntersect(pos, dir, i, d, 3.0); +        v = boxIntersect(pos, dir, refBox[i], d, 3.0);          w = max(d, 0.001);      }      else @@ -551,7 +558,7 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int          refIndex[i].w < 1 ? 4096.0*4096.0 : // <== effectively disable parallax correction for automatically placed probes to keep from bombing the world with obvious spheres                  rr); -        w = sphereWeight(pos, dir, refSphere[i].xyz, r, i, dw); +        w = sphereWeight(pos, dir, refSphere[i].xyz, r, refParams[i], dw);      }      v -= c; @@ -681,6 +688,49 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir, vec3 amblit)      return col[1]+col[0];  } +#if defined(HERO_PROBES) + +uniform vec4 clipPlane; +uniform samplerCubeArray   heroProbes; + +void tapHeroProbe(inout vec3 glossenv, vec3 pos, vec3 norm, float glossiness) +{ +    float clipDist = dot(pos.xyz, clipPlane.xyz) + clipPlane.w; +    float w = 0; +    float dw = 0; +    float falloffMult = 10; +    vec3 refnormpersp = reflect(pos.xyz, norm.xyz); +    if (heroShape < 1) +    { +        float d = 0; +        boxIntersect(pos, norm, heroBox, d, 1.0); +         +        w = max(d, 0); +    } +    else +    { +        float r = heroSphere.w; +         +        w = sphereWeight(pos, refnormpersp, heroSphere.xyz, r, vec4(1), dw); +    } + +    clipDist = clipDist * 0.95 + 0.05; +    clipDist = clamp(clipDist * falloffMult, 0, 1); +    w = clamp(w * falloffMult * clipDist, 0, 1); +    w = mix(0, w, clamp(glossiness - 0.75, 0, 1) * 4); // We only generate a quarter of the mips for the hero probes.  Linearly interpolate between normal probes and hero probes based upon glossiness. +    glossenv = mix(glossenv, textureLod(heroProbes, vec4(env_mat * refnormpersp, 0), (1.0-glossiness)*heroMipCount).xyz, w); +} + +#else + +void tapHeroProbe(inout vec3 glossenv, vec3 pos, vec3 norm, float glossiness) +{ +} + +#endif + + +  void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,          vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit)  { @@ -712,6 +762,8 @@ void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,          glossenv = mix(glossenv, ssr.rgb, ssr.a);      }  #endif + +    tapHeroProbe(glossenv, pos, norm, glossiness);  }  void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, @@ -747,7 +799,7 @@ void debugTapRefMap(vec3 pos, vec3 dir, float depth, int i, inout vec4 col)      {          if (refIndex[i].w < 0)          { -            boxIntersectDebug(origin, pos, i, col); +            boxIntersectDebug(origin, pos, refBox[i], col);          }          else          { @@ -799,6 +851,7 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout      {          float lod = (1.0-glossiness)*reflection_lods;          glossenv = sampleProbes(pos, normalize(refnormpersp), lod); +              }      if (envIntensity > 0.0) @@ -826,6 +879,9 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout      }  #endif +    tapHeroProbe(glossenv, pos, norm, glossiness); +    tapHeroProbe(legacyenv, pos, norm, 1.0); +      glossenv = clamp(glossenv, vec3(0), vec3(10));  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl index dbf20fe2d8..deb276ef9d 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl @@ -40,14 +40,13 @@ uniform sampler2D specularRect;  uniform sampler2D diffuseRect;  uniform sampler2D diffuseMap; -vec3 getNorm(vec2 screenpos); +vec4 getNorm(vec2 screenpos);  float getDepth(vec2 pos_screen);  float linearDepth(float d, float znear, float zfar);  float linearDepth01(float d, float znear, float zfar);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  vec4 getPosition(vec2 pos_screen); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);  float random (vec2 uv); @@ -57,9 +56,7 @@ void main()  {      vec2  tc = vary_fragcoord.xy;      float depth = linearDepth01(getDepth(tc), zNear, zFar); -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNorm(tc); // need `norm.w` for GET_GBUFFER_FLAG()      vec3 pos = getPositionWithDepth(tc, getDepth(tc)).xyz;      vec4 spec    = texture(specularRect, tc);      vec2 hitpixel; @@ -84,7 +81,7 @@ void main()      vec4 collectedColor = vec4(0); -    float w = tapScreenSpaceReflection(4, tc, pos, n, collectedColor, diffuseMap, 0); +    float w = tapScreenSpaceReflection(4, tc, pos, norm.xyz, collectedColor, diffuseMap, 0);      collectedColor.rgb *= specCol.rgb; diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 5e8fe9301a..96c32734e4 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -50,6 +50,7 @@ uniform float ssao_irradiance_max;  #endif  // Inputs +uniform vec4 clipPlane;  uniform mat3 env_mat;  uniform mat3  ssao_effect_mat;  uniform vec3 sun_dir; @@ -60,7 +61,7 @@ in vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec3 getNorm(vec2 pos_screen); +vec4 getNorm(vec2 pos_screen);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); @@ -127,13 +128,13 @@ void main()      vec2  tc           = vary_fragcoord.xy;      float depth        = getDepth(tc.xy);      vec4  pos          = getPositionWithDepth(tc, depth); -    vec4  norm         = texture(normalMap, tc); -    float envIntensity = norm.z; -    norm.xyz           = getNorm(tc); +    vec4  norm         = getNorm(tc); +    vec3 colorEmissive = texture(emissiveRect, tc).rgb; +    float envIntensity = colorEmissive.r;      vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;      vec4 baseColor     = texture(diffuseRect, tc); -    vec4 spec        = texture(specularRect, vary_fragcoord.xy); // NOTE: PBR linear Emissive +    vec4 spec        = texture(specularRect, tc); // NOTE: PBR linear Emissive  #if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)      vec2 scol_ambocc = texture(lightMap, vary_fragcoord.xy).rg; @@ -168,17 +169,17 @@ void main()      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 orm = texture(specularRect, tc).rgb;  +        vec3 orm = spec.rgb;           float perceptualRoughness = orm.g;          float metallic = orm.b;          float ao = orm.r; -        vec3 colorEmissive = texture(emissiveRect, tc).rgb; +                  // PBR IBL          float gloss      = 1.0 - perceptualRoughness;          sampleReflectionProbes(irradiance, radiance, tc, pos.xyz, norm.xyz, gloss, false, amblit_linear); -         +          adjustIrradiance(irradiance, ambocc);          vec3 diffuseColor; @@ -188,10 +189,15 @@ void main()          vec3 v = -normalize(pos.xyz);          color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten);      } -    else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS)) +    else if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_HDRI)) +    { +        // actual HDRI sky, just copy color value +        color = colorEmissive.rgb; +    } +    else if (GET_GBUFFER_FLAG(GBUFFER_FLAG_SKIP_ATMOS))      { -        //should only be true of WL sky, just port over base color value -        color = texture(emissiveRect, tc).rgb; +        //should only be true of WL sky, port over base color value and scale for fake HDR +        color = colorEmissive.rgb;          color = srgb_to_linear(color);          color *= sky_hdr_scale;      } @@ -209,7 +215,7 @@ void main()          vec3 legacyenv = vec3(0);          sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, tc, pos.xyz, norm.xyz, spec.a, envIntensity, false, amblit_linear); -         +          adjustIrradiance(irradiance, ambocc);          // apply lambertian IBL only (see pbrIbl) @@ -244,6 +250,7 @@ void main()              // add radiance map              applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz); +          }          color.rgb = mix(color.rgb, baseColor.rgb, baseColor.a); diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl index d31b37fb60..319fa86148 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -72,7 +72,7 @@ uniform mat4 inv_proj;  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);  float calcLegacyDistanceAttenuation(float distance, float falloff);  bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_dist, out vec3 lv, out vec4 proj_tc ); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity); +vec4 getNorm(vec2 screenpos);  vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv);  vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv );  vec2 getScreenCoord(vec4 clip); @@ -121,9 +121,8 @@ void main()          shadow = clamp(shadow, 0.0, 1.0);              } -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); +    vec4 norm = getNorm(tc); +    vec3 n = norm.xyz;      float dist_atten = calcLegacyDistanceAttenuation(dist, falloff);      if (dist_atten <= 0.0) @@ -145,7 +144,6 @@ void main()      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 colorEmissive = texture(emissiveRect, tc).rgb;           vec3 orm = spec.rgb;          float perceptualRoughness = orm.g;          float metallic = orm.b; @@ -182,6 +180,8 @@ void main()      }      else      { +        float envIntensity = texture(emissiveRect, tc).r; +          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl index f6b8299f91..f6bef1e498 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl @@ -56,7 +56,6 @@ void main()      }      vec4  pos          = getPositionWithDepth(tc, depth); -    vec4  norm         = texture(normalMap, tc);      vec4 fogged = getWaterFogView(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl index 223e55eb69..ef086fc3be 100644 --- a/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl @@ -55,9 +55,11 @@ in vec4 view;  in vec3 vary_position;  vec4 applyWaterFogViewLinearNoClip(vec3 pos, vec4 color); +void mirrorClip(vec3 position);  void main()   { +	mirrorClip(vary_position);  	vec4 color;      //get detail normals diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl index b364e454e8..b2a81aa025 100644 --- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl @@ -35,6 +35,8 @@ 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);  vec4 applyWaterFogViewLinear(vec3 pos, vec4 color); +void mirrorClip(vec3 pos); +  // PBR interface  vec2 BRDF(float NoV, float roughness); @@ -129,6 +131,7 @@ vec3 getPositionWithNDC(vec3 ndc);  void main()   { +    mirrorClip(vary_position);      vN = vary_normal;      vT = vary_tangent;      vB = cross(vN, vT); | 
