diff options
6 files changed, 90 insertions, 60 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 9405a125fd..1a96ee0736 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -73,6 +73,8 @@ const float M_PI = 3.14159265;  const float ONE_OVER_PI = 0.3183098861;  vec3 srgb_to_linear(vec3 cs); +vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); +vec3 scaleSoftClipFragLinear(vec3 light);  float calcLegacyDistanceAttenuation(float distance, float falloff)  { @@ -506,6 +508,31 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,      return color;  } +void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor) +{ +    vec3 f0 = vec3(0.04); +    diffuseColor = baseColor*(vec3(1.0)-f0); +    diffuseColor *= 1.0 - metallic; +    specularColor = mix(f0, baseColor, metallic); +} + +vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten) +{ +    vec3 color = vec3(0); + +    float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0); +     +    color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness); +     +    color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir)) * sunlit * 2.75 * scol; +    color += colorEmissive*0.5; + +    color = atmosFragLightingLinear(color, additive, atten); +    color = scaleSoftClipFragLinear(color); + +    return color; +} +  uniform vec4 waterPlane;  uniform float waterSign; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl index b3880ab178..d0d76fd0cb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl @@ -46,7 +46,7 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -#ifdef HAS_SHADOW +#ifdef HAS_SUN_SHADOW  VARYING vec3 vary_fragcoord;  uniform float near_clip;  #endif @@ -85,7 +85,7 @@ void main()  #endif      gl_Position = vert; -#ifdef HAS_SHADOW +#ifdef HAS_SUN_SHADOW      vary_fragcoord.xyz = vert.xyz + vec3(0,0,near_clip);  #endif diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index d211064701..e255c78b86 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -84,7 +84,7 @@ vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); -#ifdef HAS_SHADOW +#ifdef HAS_SUN_SHADOW  float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);  #endif @@ -191,7 +191,7 @@ void main()      float shadow = 1.0f; -#ifdef HAS_SHADOW +#ifdef HAS_SUN_SHADOW      shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, frag);  #endif diff --git a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl index 922da0c441..b39f834e41 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl @@ -44,7 +44,7 @@ uniform vec3 moon_dir;  out vec4 frag_color; -#ifdef HAS_SHADOW +#ifdef HAS_SUN_SHADOW    VARYING vec3 vary_fragcoord;    uniform vec2 screen_res;  #endif @@ -75,8 +75,6 @@ vec3 srgb_to_linear(vec3 c);  vec3 linear_to_srgb(vec3 c);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); -vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); -vec3 scaleSoftClipFragLinear(vec3 l);  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); @@ -86,14 +84,23 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,  void waterClip(vec3 pos); -// PBR interface -vec3 pbrIbl(vec3 diffuseColor, -            vec3 specularColor, -            vec3 radiance, // radiance map sample -            vec3 irradiance, // irradiance map sample -            float ao,       // ambient occlusion factor -            float nv,       // normal dot view vector -            float perceptualRoughness); +void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor); + +vec3 pbrBaseLight(vec3 diffuseColor, +                  vec3 specularColor, +                  float metallic, +                  vec3 pos, +                  vec3 norm, +                  float perceptualRoughness, +                  vec3 light_dir, +                  vec3 sunlit, +                  float scol, +                  vec3 radiance, +                  vec3 irradiance, +                  vec3 colorEmissive, +                  float ao, +                  vec3 additive, +                  vec3 atten);  vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,                       float perceptualRoughness,  @@ -126,7 +133,12 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,          float dist_atten = calcLegacyDistanceAttenuation(dist, falloff); -        vec3 intensity = dist_atten * lightColor * 3.0; +        // spotlight coefficient. +        float spot = max(dot(-ld, lv), is_pointlight); +        // spot*spot => GL_SPOT_EXPONENT=2 +        float spot_atten = spot*spot; + +        vec3 intensity = spot_atten * dist_atten * lightColor * 3.0;          color = intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);      } @@ -174,7 +186,7 @@ void main()      vec3 atten;      calcAtmosphericVarsLinear(pos.xyz, norm, light_dir, sunlit, amblit, additive, atten); -#ifdef HAS_SHADOW +#ifdef HAS_SUN_SHADOW      vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;      frag *= screen_res;      scol = sampleDirectionalShadow(pos.xyz, norm.xyz, frag); @@ -196,24 +208,16 @@ void main()      vec3  irradiance = vec3(0);      vec3  radiance  = vec3(0);      sampleReflectionProbes(irradiance, radiance, pos.xyz, norm.xyz, gloss); -    irradiance       = max(amblit*0.75,irradiance); - -    vec3 f0 = vec3(0.04); -     -    vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0); -    diffuseColor *= 1.0 - metallic; +    // Take maximium of legacy ambient vs irradiance sample as irradiance +    // NOTE: ao is applied in pbrIbl (see pbrBaseLight), do not apply here +    irradiance       = max(amblit,irradiance); -    vec3 specularColor = mix(f0, baseColor.rgb, metallic); +    vec3 diffuseColor; +    vec3 specularColor; +    calcDiffuseSpecular(baseColor.rgb, metallic, diffuseColor, specularColor);      vec3 v = -normalize(pos.xyz); -    float NdotV = clamp(abs(dot(norm.xyz, v)), 0.001, 1.0); - -    color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness); -    color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, v, light_dir) * sunlit * scol; -    color += colorEmissive*0.5; -     -    color = atmosFragLightingLinear(color, additive, atten); -    color  = scaleSoftClipFragLinear(color); +    color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit, scol, radiance, irradiance, colorEmissive, ao, additive, atten);      vec3 light = vec3(0); diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index eea497bce5..879f4ef510 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -89,14 +89,23 @@ vec3 srgb_to_linear(vec3 c);  vec4 applyWaterFogViewLinear(vec3 pos, vec4 color);  #endif -// PBR interface -vec3 pbrIbl(vec3 diffuseColor, -            vec3 specularColor, -            vec3 radiance, // radiance map sample -            vec3 irradiance, // irradiance map sample -            float ao,       // ambient occlusion factor -            float nv,       // normal dot view vector -            float perceptualRoughness); +void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor); + +vec3 pbrBaseLight(vec3 diffuseColor, +                  vec3 specularColor, +                  float metallic, +                  vec3 pos, +                  vec3 norm, +                  float perceptualRoughness, +                  vec3 light_dir, +                  vec3 sunlit, +                  float scol, +                  vec3 radiance, +                  vec3 irradiance, +                  vec3 colorEmissive, +                  float ao, +                  vec3 additive, +                  vec3 atten);  vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,                       float perceptualRoughness,  @@ -160,25 +169,15 @@ void main()          sampleReflectionProbes(irradiance, radiance, pos.xyz, norm.xyz, gloss);          // Take maximium of legacy ambient vs irradiance sample as irradiance -        // NOTE: ao is applied in pbrIbl, do not apply here +        // NOTE: ao is applied in pbrIbl (see pbrBaseLight), do not apply here          irradiance       = max(amblit,irradiance); -        vec3 f0 = vec3(0.04); -        vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0); -        diffuseColor *= 1.0 - metallic; - -        vec3 specularColor = mix(f0, baseColor.rgb, metallic); +        vec3 diffuseColor; +        vec3 specularColor; +        calcDiffuseSpecular(baseColor.rgb, metallic, diffuseColor, specularColor);          vec3 v = -normalize(pos.xyz); -        float NdotV = clamp(abs(dot(norm.xyz, v)), 0.001, 1.0); -         -        color.rgb += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, v, normalize(light_dir)) * sunlit * 2.75 * scol; -        color.rgb += colorEmissive*0.5; -         -        color.rgb += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness); - -        color = atmosFragLightingLinear(color, additive, atten); -        color  = scaleSoftClipFragLinear(color); +        color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit, scol, radiance, irradiance, colorEmissive, ao, additive, atten);      }      else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS))      { diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index a70c94ab89..6ba31b25ff 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1639,7 +1639,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          if (use_sun_shadow)          { -            shader->addPermutation("HAS_SHADOW", "1"); +            shader->addPermutation("HAS_SUN_SHADOW", "1");          }          if (ambient_kill) @@ -1944,7 +1944,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()              shader->addPermutation("USE_INDEXED_TEX", "1");              if (use_sun_shadow)              { -                shader->addPermutation("HAS_SHADOW", "1"); +                shader->addPermutation("HAS_SUN_SHADOW", "1");              }              if (ambient_kill) @@ -2020,7 +2020,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()              if (use_sun_shadow)              { -                shader->addPermutation("HAS_SHADOW", "1"); +                shader->addPermutation("HAS_SUN_SHADOW", "1");              }              shader->mRiggedVariant = &gDeferredSkinnedAlphaImpostorProgram; @@ -2078,7 +2078,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()              shader[i]->addPermutation("HAS_ALPHA_MASK", "1");              if (use_sun_shadow)              { -                shader[i]->addPermutation("HAS_SHADOW", "1"); +                shader[i]->addPermutation("HAS_SUN_SHADOW", "1");              }              if (ambient_kill) @@ -2654,7 +2654,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1");  		if (use_sun_shadow)  		{ -			gDeferredAvatarAlphaProgram.addPermutation("HAS_SHADOW", "1"); +			gDeferredAvatarAlphaProgram.addPermutation("HAS_SUN_SHADOW", "1");  		}          if (ambient_kill) | 
