summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Houlton <euclid@lindenlab.com>2020-02-07 22:46:46 +0000
committerDave Houlton <euclid@lindenlab.com>2020-02-07 22:46:46 +0000
commit90e3974b165b8baa2e0b76fe7469910852d77624 (patch)
treeebc861920c2955a10e308a5d5087484c7d442015
parent3adbc44a072bbce9be08ea863cdea336ddb55444 (diff)
parent8e0d5f463edc24101ecdcb420c05f6d5b0e6b6c0 (diff)
Merged in SL-12682 (pull request #8)
Fixes for SL-12682 and SL-12592 Approved-by: Michael Pohoreski
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/materialF.glsl48
1 files changed, 24 insertions, 24 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 8a6b2b7066..d28fc128b6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -249,24 +249,25 @@ void main()
vec4 spec = vec4(specular_color.rgb, 1.0);
#endif
- vec4 norm = vec4(0,0,0,1.0);
- vec3 tnorm;
+ vec3 norm = vec3(0);
+ float bmap_specular = 1.0;
#ifdef HAS_NORMAL_MAP
- norm = texture2D(bumpMap, vary_texcoord1.xy);
- norm.xyz = norm.xyz * 2 - 1;
-
- // tangent space norm
- tnorm = vec3(dot(norm.xyz,vary_mat0),
- dot(norm.xyz,vary_mat1),
- dot(norm.xyz,vary_mat2));
+ vec4 bump_sample = texture2D(bumpMap, vary_texcoord1.xy);
+ norm = (bump_sample.xyz * 2) - vec3(1);
+ bmap_specular = bump_sample.w;
+
+ // convert sampled normal to tangent space normal
+ norm = vec3(dot(norm, vary_mat0),
+ dot(norm, vary_mat1),
+ dot(norm, vary_mat2));
#else
- tnorm = vary_normal;
+ norm = vary_normal;
#endif
- norm.xyz = normalize(tnorm.xyz);
+ norm = normalize(norm);
- vec2 abnormal = encode_normal(norm.xyz);
+ vec2 abnormal = encode_normal(norm);
vec4 final_color = vec4(diffuse_linear.rgb, 0.0);
@@ -311,13 +312,13 @@ void main()
final_specular.a = specular_color.a;
#ifdef HAS_SPECULAR_MAP
- final_specular.a *= norm.a;
+ final_specular.a *= bmap_specular;
final_normal.z *= spec.a;
#endif
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
- if (emissive_brightness < 1.0)
+ if (emissive_brightness <= 1.0)
{
//forward rendering, output just lit RGBA
vec3 pos = vary_position;
@@ -325,7 +326,7 @@ void main()
float shadow = 1.0f;
#ifdef HAS_SUN_SHADOW
- shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
+ shadow = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
#endif
spec = final_specular;
@@ -342,18 +343,17 @@ void main()
calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
-
+ vec3 refnormpersp = normalize(reflect(pos.xyz, norm));
- float da = dot(norm.xyz, normalize(light_dir.xyz));
- float final_da = clamp(da, 0.0, 1.0);
+ float da = dot(norm, normalize(light_dir));
+ da = clamp(da, 0.0, 1.0); // No negative light contributions
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
ambient = (1.0 - ambient);
- vec3 sun_contrib = min(final_da, shadow) * sunlit;
+ vec3 sun_contrib = min(da, shadow) * sunlit;
// vec3 debug_sun_contrib = sun_contrib;
@@ -383,8 +383,8 @@ void main()
//vec3 ref = dot(pos+lv, norm);
vec3 h = normalize(light_dir.xyz+npos);
- float nh = dot(norm.xyz, h);
- float nv = dot(norm.xyz, npos);
+ float nh = dot(norm, h);
+ float nv = dot(norm, npos);
float vh = dot(npos, h);
float sa = nh;
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
@@ -435,7 +435,7 @@ void main()
vec3 light = vec3(0,0,0);
-#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
+#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
LIGHT_LOOP(1)
LIGHT_LOOP(2)
@@ -461,7 +461,7 @@ void main()
//color.rgb = vec3(ambient);
//color.rgb = sunlit;
//color.rgb = debug_post_ambient;
-//color.rgb = vec3(final_da);
+//color.rgb = vec3(da);
//color.rgb = debug_sun_contrib;
//color.rgb = debug_post_sunlight;
//color.rgb = diffuse_srgb.rgb;