diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class3/deferred')
7 files changed, 50 insertions, 348 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl index 54a887262b..5483a4e29c 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl @@ -40,8 +40,6 @@ in vec3 vary_position;  uniform samplerCube environmentMap;  vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten); -vec3 legacy_adjust_fullbright(vec3 c); -vec3 legacy_adjust(vec3 c);  void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);  vec3 linear_to_srgb(vec3 c); @@ -82,10 +80,8 @@ void main()      vec4 spec = vec4(0,0,0,0);      sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, vec2(0), pos.xyz, norm.xyz, spec.a, env_intensity, false, amblit); -    color.rgb = legacy_adjust(color.rgb);      color.rgb = srgb_to_linear(color.rgb); -    color.rgb = legacy_adjust_fullbright(color.rgb); -     +      applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity);      color.rgb = atmosFragLighting(color.rgb, additive, atten);  #endif diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index af49e76984..db0daa9b7e 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -48,8 +48,6 @@ 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); -vec3 legacy_adjust(vec3 c); -vec3 legacy_adjust_fullbright(vec3 c);  uniform vec4 clipPlane;  uniform float clipSign; @@ -329,7 +327,6 @@ void main()  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)      //forward rendering, output lit linear color -    diffcol.rgb = legacy_adjust(diffcol.rgb);      diffcol.rgb = srgb_to_linear(diffcol.rgb);      spec.rgb = srgb_to_linear(spec.rgb);      spec.a = glossiness; // pack glossiness into spec alpha for lighting functions @@ -395,7 +392,7 @@ void main()          applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);      } -    color = mix(color.rgb, legacy_adjust_fullbright(diffcol.rgb), emissive); +    color = mix(color.rgb, diffcol.rgb, emissive);      if (env > 0.0)      {  // add environmentmap diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl index 2a096a98ec..ec8168465e 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl @@ -52,7 +52,6 @@ vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensi  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 c); -vec3 legacy_adjust(vec3 c);  // Util  vec3 hue_to_rgb(float hue); @@ -67,9 +66,6 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  void main()  { -#if defined(LOCAL_LIGHT_KILL) -    discard;  // Bail immediately -#else      vec3 final_color = vec3(0, 0, 0);      vec2 tc          = getScreenCoord(vary_fragcoord);      vec3 pos         = getPosition(tc).xyz; @@ -118,7 +114,7 @@ void main()                  float dist_atten = calcLegacyDistanceAttenuation(dist, falloff); -                vec3 intensity = dist_atten * lightColor * 3.9; +                vec3 intensity = dist_atten * lightColor * 3.25;                  final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);              } @@ -126,7 +122,6 @@ void main()      }      else      { -        diffuse.rgb = legacy_adjust(diffuse.rgb);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); @@ -174,7 +169,6 @@ void main()      frag_color.rgb = max(final_color, vec3(0));      frag_color.a   = 0.0; -#endif // LOCAL_LIGHT_KILL  #ifdef IS_AMD_CARD      // If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl deleted file mode 100644 index 23120bbbbe..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl +++ /dev/null @@ -1,263 +0,0 @@ -/**  - * @file class3\deferred\multiSpotLightF.glsl - * - * $LicenseInfo:firstyear=2022&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2022, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -/*[EXTRA_CODE_HERE]*/ - -out vec4 frag_color; - -uniform sampler2D diffuseRect; -uniform sampler2D specularRect; -uniform sampler2D depthMap; -uniform sampler2D normalMap; -uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl -uniform samplerCube environmentMap; -uniform sampler2D lightMap; -uniform sampler2D projectionMap; // rgba -uniform sampler2D lightFunc; - -uniform mat4 proj_mat; //screen space to light space -uniform float proj_near; //near clip for projection -uniform vec3 proj_p; //plane projection is emitting from (in screen space) -uniform vec3 proj_n; -uniform float proj_focus; //distance from plane to begin blurring -uniform float proj_lod;  //(number of mips in proj map) -uniform float proj_range; //range between near clip and far clip plane of projection -uniform float proj_ambient_lod; -uniform float proj_ambiance; -uniform float near_clip; -uniform float far_clip; - -uniform vec3 proj_origin; //origin of projection to be used for angular attenuation -uniform float sun_wash; -uniform int proj_shadow_idx; -uniform float shadow_fade; - -// Light params -uniform vec3 center; -uniform float size; -uniform vec3 color; -uniform float falloff; - -in vec4 vary_fragcoord; -uniform vec2 screen_res; - -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); -vec3 colorized_dot(float x); -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); -vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv); -vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv ); -vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n); -vec2 getScreenXY(vec4 clip); -vec2 getScreenCoord(vec4 clip); -vec3 srgb_to_linear(vec3 cs); -vec3 legacy_adjust(vec3 c); -vec4 texture2DLodSpecular(vec2 tc, float lod); - -vec4 getPosition(vec2 pos_screen); - -const float M_PI = 3.14159265; - -vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  -                    float perceptualRoughness,  -                    float metallic, -                    vec3 n, // normal -                    vec3 v, // surface point to camera -                    vec3 l); //surface point to light - -void main() -{ -#if defined(LOCAL_LIGHT_KILL) -    discard; -#else -    vec3 final_color = vec3(0,0,0); -    vec2 tc          = getScreenCoord(vary_fragcoord); -    vec3 pos         = getPosition(tc).xyz; - -    vec3 lv; -    vec4 proj_tc; -    float dist, l_dist; -    if (clipProjectedLightVars(center, pos, dist, l_dist, lv, proj_tc)) -    { -        discard; -    } - -    float shadow = 1.0; -     -    if (proj_shadow_idx >= 0) -    { -        vec4 shd = texture(lightMap, tc); -        shadow = (proj_shadow_idx==0)?shd.b:shd.a; -        shadow += shadow_fade; -        shadow = clamp(shadow, 0.0, 1.0);         -    } - -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); - -    float dist_atten = calcLegacyDistanceAttenuation(dist, falloff); -    if (dist_atten <= 0.0) -    { -        discard; -    } - -    lv = proj_origin-pos.xyz; -    vec3  h, l, v = -normalize(pos); -    float nh, nl, nv, vh, lightDist; -    calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist); - -    vec3 diffuse = texture(diffuseRect, tc).rgb; -    vec4 spec    = texture(specularRect, tc); -    vec3 dlit    = vec3(0, 0, 0); -    vec3 slit    = vec3(0, 0, 0); - -    vec3 amb_rgb = vec3(0); - -    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; -        vec3 f0 = vec3(0.04); -        vec3 baseColor = diffuse.rgb; -         -        vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0); -        diffuseColor *= 1.0 - metallic; - -        vec3 specularColor = mix(f0, baseColor.rgb, metallic); - -        // We need this additional test inside a light's frustum since a spotlight's ambiance can be applied -        if (proj_tc.x > 0.0 && proj_tc.x < 1.0 -        &&  proj_tc.y > 0.0 && proj_tc.y < 1.0) -        { -            float lit = 0.0; -            float amb_da = 0.0; - -            if (nl > 0.0) -            { -                amb_da += (nl*0.5 + 0.5) * proj_ambiance; -                 -                dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy ); - -                vec3 intensity = dist_atten * dlit * 3.9 * shadow; // Legacy attenuation, magic number to balance with legacy materials -                final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv)); -            } - -            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); -            final_color += diffuse.rgb * amb_rgb; -        } -    } -    else -    { -        diffuse = legacy_adjust(diffuse); -        diffuse = srgb_to_linear(diffuse); -        spec.rgb = srgb_to_linear(spec.rgb); - -        if (proj_tc.z > 0.0 && -            proj_tc.x < 1.0 && -            proj_tc.y < 1.0 && -            proj_tc.x > 0.0 && -            proj_tc.y > 0.0) -        { -            float amb_da = 0; -            float lit = 0.0; - -            if (nl > 0.0) -            { -                lit = nl * dist_atten; - -                dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy ); - -                final_color = dlit*lit*diffuse*shadow; - -                // unshadowed for consistency between forward and deferred? -                amb_da += (nl*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance; -            } -         -            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); -            final_color += diffuse.rgb * amb_rgb; -        } -     -        if (spec.a > 0.0) -        { -            dlit *= min(nl*6.0, 1.0) * dist_atten; - -            float fres = pow(1 - vh, 5)*0.4+0.5; - -            float gtdenom = 2 * nh; -            float gt = max(0, min(gtdenom * nv / vh, gtdenom * nl / vh)); -                                 -            if (nh > 0.0) -            { -                float scol = fres*texture(lightFunc, vec2(nh, spec.a)).r*gt/(nh*nl); -                vec3 speccol = dlit*scol*spec.rgb*shadow; -                speccol = clamp(speccol, vec3(0), vec3(1)); -                final_color += speccol; -            } -        }    - -        if (envIntensity > 0.0) -        { -            vec3 ref = reflect(normalize(pos), n); -         -            //project from point pos in direction ref to plane proj_p, proj_n -            vec3 pdelta = proj_p-pos; -            float ds = dot(ref, proj_n); -         -            if (ds < 0.0) -            { -                vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; -             -                vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); - -                if (stc.z > 0.0) -                { -                    stc /= stc.w; -                                 -                    if (stc.x < 1.0 && -                        stc.y < 1.0 && -                        stc.x > 0.0 && -                        stc.y > 0.0) -                    { -                        final_color += color.rgb * texture2DLodSpecular(stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; -                    } -                } -            } -        } -    } - -    //not sure why, but this line prevents MATBUG-194 -    final_color = max(final_color, vec3(0.0)); - -    //output linear -    frag_color.rgb = final_color; -    frag_color.a = 0.0; -#endif // LOCAL_LIGHT_KILL -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl index 42ba96148c..31af1208bd 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl @@ -57,7 +57,6 @@ vec4 getPosition(vec2 pos_screen);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 c); -vec3 legacy_adjust(vec3 c);  float getDepth(vec2 tc);  vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  @@ -107,7 +106,7 @@ void main()          vec3 specularColor = mix(f0, baseColor.rgb, metallic); -        vec3 intensity = dist_atten * color * 3.9; // Legacy attenuation, magic number to balance with legacy materials +        vec3 intensity = dist_atten * color * 3.25; // Legacy attenuation, magic number to balance with legacy materials          final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv));      }      else @@ -116,7 +115,6 @@ void main()          {              discard;          } -        diffuse = legacy_adjust(diffuse);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index d42388ae78..8b7aea24ed 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -86,7 +86,6 @@ float getDepth(vec2 pos_screen);  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); -vec3 legacy_adjust(vec3 c);  uniform vec4 waterPlane; @@ -234,8 +233,6 @@ void main()      else      {          // legacy shaders are still writng sRGB to gbuffer -        baseColor.rgb = legacy_adjust(baseColor.rgb); -                  baseColor.rgb = srgb_to_linear(baseColor.rgb);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl index 1ea801d7d7..d31b37fb60 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -25,16 +25,6 @@  /*[EXTRA_CODE_HERE]*/ -#define DEBUG_ANY_LIGHT_TYPE         0 // Output green light cone -#define DEBUG_LEG_LIGHT_TYPE         0 // Show Legacy objects in green -#define DEBUG_PBR_LIGHT_TYPE         0 // Show PBR objects in green -#define DEBUG_PBR_SPOT               0 -#define DEBUG_PBR_SPOT_DIFFUSE       0 -#define DEBUG_PBR_SPOT_SPECULAR      0 - -#define DEBUG_SPOT_NL                  0 // monochome area effected by light -#define DEBUG_SPOT_ZERO                0 // Output zero for spotlight -  out vec4 frag_color;  uniform sampler2D diffuseRect; @@ -64,11 +54,16 @@ uniform float sun_wash;  uniform int proj_shadow_idx;  uniform float shadow_fade; +// Light params +#if defined(MULTI_SPOTLIGHT) +uniform vec3 center; +#else +in vec3 trans_center; +#endif  uniform float size;  uniform vec3 color;  uniform float falloff; -in vec3 trans_center;  in vec4 vary_fragcoord;  uniform vec2 screen_res; @@ -80,11 +75,8 @@ bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_d  vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);  vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv);  vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv ); -vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n); -vec2 getScreenXY(vec4 clip_point); -vec2 getScreenCoord(vec4 clip_point); -vec3 srgb_to_linear(vec3 c); -vec3 legacy_adjust(vec3 c); +vec2 getScreenCoord(vec4 clip); +vec3 srgb_to_linear(vec3 cs);  vec4 texture2DLodSpecular(vec2 tc, float lod);  vec4 getPosition(vec2 pos_screen); @@ -100,9 +92,6 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  void main()  { -#if defined(LOCAL_LIGHT_KILL) -    discard; -#else      vec3 final_color = vec3(0,0,0);      vec2 tc          = getScreenCoord(vary_fragcoord);      vec3 pos         = getPosition(tc).xyz; @@ -110,24 +99,31 @@ void main()      vec3 lv;      vec4 proj_tc;      float dist, l_dist; -    if (clipProjectedLightVars(trans_center, pos, dist, l_dist, lv, proj_tc)) +    vec3 c; +#if defined(MULTI_SPOTLIGHT) +    c = center; +#else +    c = trans_center; +#endif + +    if (clipProjectedLightVars(c, pos, dist, l_dist, lv, proj_tc))      {          discard;      }      float shadow = 1.0; - +          if (proj_shadow_idx >= 0)      {          vec4 shd = texture(lightMap, tc); -        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a; +        shadow = (proj_shadow_idx==0)?shd.b:shd.a;          shadow += shadow_fade; -        shadow = clamp(shadow, 0.0, 1.0); +        shadow = clamp(shadow, 0.0, 1.0);              }      float envIntensity;      vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity);      float dist_atten = calcLegacyDistanceAttenuation(dist, falloff);      if (dist_atten <= 0.0) @@ -135,7 +131,7 @@ void main()          discard;      } -    lv = proj_origin-pos.xyz; // NOTE: Re-using lv +    lv = proj_origin-pos.xyz;      vec3  h, l, v = -normalize(pos);      float nh, nl, nv, vh, lightDist;      calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist); @@ -146,10 +142,11 @@ void main()      vec3 slit    = vec3(0, 0, 0);      vec3 amb_rgb = vec3(0); +      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 colorEmissive = texture(emissiveRect, tc).rgb; -        vec3 orm = spec.rgb;  +        vec3 colorEmissive = texture(emissiveRect, tc).rgb;  +        vec3 orm = spec.rgb;          float perceptualRoughness = orm.g;          float metallic = orm.b;          vec3 f0 = vec3(0.04); @@ -167,33 +164,34 @@ void main()              float lit = 0.0;              float amb_da = 0.0; +            lv = normalize(lv); +              if (nl > 0.0)              {                  amb_da += (nl*0.5 + 0.5) * proj_ambiance;                  dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy ); -                vec3 intensity = dist_atten * dlit * 3.9 * shadow; // Legacy attenuation -                final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv)); +                vec3 intensity = dist_atten * dlit * 3.25 * shadow; // Legacy attenuation, magic number to balance with legacy materials +                final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);              } -            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); -            final_color += diffuse.rgb * amb_rgb; +            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ) * 3.25; //magic number to balance with legacy ambiance +            final_color += amb_rgb * pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, -lv);          }      }      else      { -        diffuse = legacy_adjust(diffuse);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); -         +          if (proj_tc.z > 0.0 &&              proj_tc.x < 1.0 &&              proj_tc.y < 1.0 &&              proj_tc.x > 0.0 &&              proj_tc.y > 0.0)          { -            float amb_da = proj_ambiance; +            float amb_da = 0;              float lit = 0.0;              if (nl > 0.0) @@ -204,24 +202,23 @@ void main()                  final_color = dlit*lit*diffuse*shadow; +                // unshadowed for consistency between forward and deferred?                  amb_da += (nl*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance;              } - -            vec3 amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); -            final_color += diffuse.rgb*amb_rgb; -  #if DEBUG_LEG_LIGHT_TYPE -            final_color = vec3(0,0.5,0); -  #endif +         +            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); +            final_color += diffuse.rgb * amb_rgb * max(dot(-normalize(lv), n), 0.0);          } - +              if (spec.a > 0.0)          {              dlit *= min(nl*6.0, 1.0) * dist_atten; -            float fres = pow(1 - dot(h, v), 5)*0.4+0.5; + +            float fres = pow(1 - vh, 5)*0.4+0.5;              float gtdenom = 2 * nh;              float gt = max(0, min(gtdenom * nv / vh, gtdenom * nl / vh)); - +                                              if (nh > 0.0)              {                  float scol = fres*texture(lightFunc, vec2(nh, spec.a)).r*gt/(nh*nl); @@ -229,26 +226,26 @@ void main()                  speccol = clamp(speccol, vec3(0), vec3(1));                  final_color += speccol;              } -        } +        }             if (envIntensity > 0.0)          {              vec3 ref = reflect(normalize(pos), n); - +                      //project from point pos in direction ref to plane proj_p, proj_n              vec3 pdelta = proj_p-pos;              float ds = dot(ref, proj_n); - +                      if (ds < 0.0)              {                  vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; - +                              vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));                  if (stc.z > 0.0)                  {                      stc /= stc.w; - +                                                      if (stc.x < 1.0 &&                          stc.y < 1.0 &&                          stc.x > 0.0 && @@ -261,24 +258,10 @@ void main()          }      } -#if DEBUG_PBR_SPOT_DIFFUSE -    final_color = vec3(nl * dist_atten); -#endif -#if DEBUG_SPOT_NL -    final_color = vec3(nl); -#endif -#if DEBUG_SPOT_ZERO -    final_color = vec3(0,0,0); -#endif -#if DEBUG_ANY_LIGHT_TYPE -    final_color = vec3(0,0.3333,0); -#endif -      //not sure why, but this line prevents MATBUG-194      final_color = max(final_color, vec3(0.0)); -    //output linear colors as gamma correction happens down stream +    //output linear      frag_color.rgb = final_color;      frag_color.a = 0.0; -#endif // LOCAL_LIGHT_KILL  } | 
