diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 153c7391d..65d6e1a80 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -31,7 +31,6 @@ out vec4 frag_color; //class 1 -- no shadows - uniform sampler2D diffuseRect; uniform sampler2D specularRect; uniform sampler2D depthMap; @@ -63,38 +62,33 @@ uniform float size; VARYING vec4 vary_fragcoord; -vec3 decode_normal(vec2 enc); uniform mat4 inv_proj; uniform vec2 noise_scale; +vec3 decode_normal(vec2 enc); vec4 getPosition(vec2 pos_screen); -vec3 srgb_to_linear(vec3 cs); +vec4 srgb_to_linear(vec4 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret.rgb = srgb_to_linear(ret.rgb); - + + ret = srgb_to_linear(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); - float det = min(lod/(proj_lod*0.5), 1.0); - float d = min(dist.x, dist.y); - - d *= min(1, d * (proj_lod - lod)); - + d *= min(1, d * (proj_lod - lod)); float edge = 0.25*det; - ret *= clamp(d/edge, 0.0, 1.0); - + return ret; } vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret.rgb = srgb_to_linear(ret.rgb); - + ret = srgb_to_linear(ret); + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); float det = min(lod/(proj_lod*0.5), 1.0); @@ -111,7 +105,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret.rgb = srgb_to_linear(ret.rgb); + ret = srgb_to_linear(ret); vec2 dist = tc-vec2(0.5); @@ -136,8 +130,9 @@ void main() { discard; } - + vec3 norm = texture2D(normalMap, frag.xy).xyz; + float envIntensity = norm.z; norm = decode_normal(norm.xy); @@ -166,12 +161,12 @@ void main() lv = proj_origin-pos.xyz; lv = normalize(lv); float da = dot(norm, lv); - + vec3 col = vec3(0,0,0); - + vec3 diff_tex = texture2D(diffuseRect, frag.xy).rgb; vec3 dlit = vec3(0, 0, 0); - + float noise = texture2D(noiseMap, frag.xy*noise_scale).b; if (proj_tc.z > 0.0 && proj_tc.x < 1.0 && @@ -184,32 +179,34 @@ void main() if (da > 0.0) { + lit = da * dist_atten * noise; + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; - + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - + dlit = color.rgb * plcol.rgb * plcol.a; - - lit = da * dist_atten * noise; - + col = dlit*lit*diff_tex; amb_da += (da*0.5)*proj_ambiance; } + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); - + amb_da += (da*da*0.5+0.5)*proj_ambiance; - + amb_da *= dist_atten * noise; - + amb_da = min(amb_da, 1.0-lit); - col += amb_da*color.rgb*diff_tex*amb_plcol.rgb*amb_plcol.a; + + col += amb_da*color*diff_tex*amb_plcol.rgb*amb_plcol.a; } - - + + vec4 spec = texture2D(specularRect, frag.xy); - + if (spec.a > 0.0) { dlit *= min(da*6.0, 1.0) * dist_atten; @@ -252,21 +249,21 @@ void main() if (stc.z > 0.0) { stc /= stc.w; - float fatten = clamp(envIntensity*envIntensity+envIntensity*0.25, 0.25, 1.0); - - stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); - + if (stc.x < 1.0 && stc.y < 1.0 && stc.x > 0.0 && stc.y > 0.0) { - col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod).rgb*spec.rgb; + col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * envIntensity; } } } } - + + //not sure why, but this line prevents MATBUG-194 + col = max(col, vec3(0.0)); + frag_color.rgb = col; frag_color.a = 0.0; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 582e1032c..1cecb30e6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -23,7 +23,6 @@ * $/LicenseInfo$ */ - #ifdef DEFINE_GL_FRAGCOLOR out vec4 frag_color; #else @@ -56,9 +55,10 @@ uniform float far_clip; uniform vec3 proj_origin; //origin of projection to be used for angular attenuation uniform float sun_wash; -uniform float size; + uniform vec3 color; uniform float falloff; +uniform float size; VARYING vec3 trans_center; VARYING vec4 vary_fragcoord; @@ -73,16 +73,15 @@ vec4 srgb_to_linear(vec4 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = srgb_to_linear(ret); - - vec2 dist = tc-vec2(0.5); - - float det = max(1.0-lod/(proj_lod*0.5), 0.0); - - float d = dot(dist,dist); - - ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); - + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); + float det = min(lod/(proj_lod*0.5), 1.0); + float d = min(dist.x, dist.y); + d *= min(1, d * (proj_lod - lod)); + float edge = 0.25*det; + ret *= clamp(d/edge, 0.0, 1.0); + return ret; } @@ -90,7 +89,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); ret = srgb_to_linear(ret); - + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); float det = min(lod/(proj_lod*0.5), 1.0); @@ -132,10 +131,11 @@ void main() { discard; } - - + vec3 norm = texture2D(normalMap, frag.xy).xyz; + float envIntensity = norm.z; + norm = decode_normal(norm.xy); norm = normalize(norm); @@ -162,26 +162,21 @@ void main() lv = proj_origin-pos.xyz; lv = normalize(lv); float da = dot(norm, lv); - - vec3 col = vec3(0,0,0); - - vec3 diff_tex = texture2D(diffuseRect, frag.xy).rgb; - - vec4 spec = texture2D(specularRect, frag.xy); - + vec3 col = vec3(0,0,0); + + vec3 diff_tex = texture2D(diffuseRect, frag.xy).rgb; + vec3 dlit = vec3(0, 0, 0); float noise = texture2D(noiseMap, frag.xy*noise_scale).b; - vec3 dlit = vec3(0, 0, 0); - 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 lit = 0.0; + float amb_da = proj_ambiance; if (da > 0.0) { @@ -189,28 +184,34 @@ void main() float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; - + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); + dlit = color.rgb * plcol.rgb * plcol.a; - + col = dlit*lit*diff_tex; - //amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; + amb_da += (da*0.5)*proj_ambiance; } + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); - + amb_da += (da*da*0.5+0.5)*proj_ambiance; - + amb_da *= dist_atten * noise; - + amb_da = min(amb_da, 1.0-lit); - col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a*diff_tex.rgb; + + col += amb_da*color*diff_tex*amb_plcol.rgb*amb_plcol.a; } - + + + vec4 spec = texture2D(specularRect, frag.xy); if (spec.a > 0.0) { dlit *= min(da*6.0, 1.0) * dist_atten; + vec3 npos = -normalize(pos); //vec3 ref = dot(pos+lv, norm); @@ -223,17 +224,15 @@ void main() float gtdenom = 2 * nh; float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); - + if (nh > 0.0) { - float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); col += dlit*scol*spec.rgb; //col += spec.rgb; } } - if (envIntensity > 0.0) { vec3 ref = reflect(normalize(pos), norm); @@ -245,29 +244,27 @@ void main() 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.xy /= stc.w; + stc /= stc.w; - float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); - - //stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); - stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); - if (stc.x < 1.0 && stc.y < 1.0 && stc.x > 0.0 && stc.y > 0.0) { - col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*spec.rgb; + col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * envIntensity; } } } } - + + //not sure why, but this line prevents MATBUG-194 + col = max(col, vec3(0.0)); + frag_color.rgb = col; frag_color.a = 0.0; } diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index a74b2187d..ed1065cd3 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -22,7 +22,6 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ - #ifdef DEFINE_GL_FRAGCOLOR out vec4 frag_color; @@ -35,7 +34,6 @@ uniform sampler2D specularRect; uniform sampler2D depthMap; uniform sampler2D normalMap; uniform samplerCube environmentMap; -uniform sampler2D lightMap; uniform sampler2D noiseMap; uniform sampler2D projectionMap; uniform sampler2D lightFunc; @@ -54,6 +52,9 @@ uniform float far_clip; uniform vec3 proj_origin; //origin of projection to be used for angular attenuation uniform float sun_wash; + +// Shadows +uniform sampler2D lightMap; uniform int proj_shadow_idx; uniform float shadow_fade; @@ -69,23 +70,18 @@ uniform vec2 noise_scale; vec3 decode_normal(vec2 enc); vec4 getPosition(vec2 pos_screen); -vec3 srgb_to_linear(vec3 cs); +vec4 srgb_to_linear(vec4 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret.rgb = srgb_to_linear(ret.rgb); + ret = srgb_to_linear(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); - float det = min(lod/(proj_lod*0.5), 1.0); - float d = min(dist.x, dist.y); - - d *= min(1, d * (proj_lod - lod)); - + d *= min(1, d * (proj_lod - lod)); float edge = 0.25*det; - ret *= clamp(d/edge, 0.0, 1.0); return ret; @@ -94,7 +90,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret.rgb = srgb_to_linear(ret.rgb); + ret = srgb_to_linear(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -112,7 +108,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret.rgb = srgb_to_linear(ret.rgb); + ret = srgb_to_linear(ret); vec2 dist = tc-vec2(0.5); @@ -137,9 +133,9 @@ void main() { discard; } - + float shadow = 1.0; - + if (proj_shadow_idx >= 0) { vec4 shd = texture2D(lightMap, frag.xy); @@ -148,9 +144,9 @@ void main() sh[1] = shd.a; shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); } - + vec3 norm = texture2D(normalMap, frag.xy).xyz; - + float envIntensity = norm.z; norm = decode_normal(norm.xy); @@ -181,7 +177,7 @@ void main() float da = dot(norm, lv); vec3 col = vec3(0,0,0); - + vec3 diff_tex = texture2D(diffuseRect, frag.xy).rgb; vec3 dlit = vec3(0, 0, 0); @@ -194,33 +190,32 @@ void main() { float lit = 0.0; float amb_da = proj_ambiance; - + if (da > 0.0) { + lit = da * dist_atten * noise; float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; - + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - + dlit = color.rgb * plcol.rgb * plcol.a; - - lit = da * dist_atten * noise; col = dlit*lit*diff_tex*shadow; amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; } - + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); - + amb_da += (da*da*0.5+0.5)*proj_ambiance; - + amb_da *= dist_atten * noise; - + amb_da = min(amb_da, 1.0-lit); - - col += amb_da*color.rgb*diff_tex*amb_plcol.rgb*amb_plcol.a; + + col += amb_da*color*diff_tex*amb_plcol.rgb*amb_plcol.a; } @@ -229,7 +224,7 @@ void main() if (spec.a > 0.0) { dlit *= min(da*6.0, 1.0) * dist_atten; - + vec3 npos = -normalize(pos); //vec3 ref = dot(pos+lv, norm); @@ -242,7 +237,7 @@ void main() float gtdenom = 2 * nh; float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); - + if (nh > 0.0) { float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); @@ -262,27 +257,23 @@ void main() if (ds < 0.0) { vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; - + vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); - stc /= stc.w; if (stc.z > 0.0) { - float fatten = clamp(envIntensity*envIntensity+envIntensity*0.25, 0.25, 1.0); + stc /= stc.w; - stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); - if (stc.x < 1.0 && stc.y < 1.0 && stc.x > 0.0 && stc.y > 0.0) { - col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod).rgb*shadow*spec.rgb; + col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; } } } } - //not sure why, but this line prevents MATBUG-194 col = max(col, vec3(0.0)); diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index c44c630ec..add148bd0 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -22,7 +22,6 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ - #ifdef DEFINE_GL_FRAGCOLOR out vec4 frag_color; @@ -35,7 +34,6 @@ uniform sampler2D specularRect; uniform sampler2D depthMap; uniform sampler2D normalMap; uniform samplerCube environmentMap; -uniform sampler2D lightMap; uniform sampler2D noiseMap; uniform sampler2D projectionMap; uniform sampler2D lightFunc; @@ -54,12 +52,15 @@ uniform float far_clip; uniform vec3 proj_origin; //origin of projection to be used for angular attenuation uniform float sun_wash; + +// Shadow +uniform sampler2D lightMap; uniform int proj_shadow_idx; uniform float shadow_fade; -uniform float size; uniform vec3 color; uniform float falloff; +uniform float size; VARYING vec3 trans_center; VARYING vec4 vary_fragcoord; @@ -74,18 +75,13 @@ vec4 srgb_to_linear(vec4 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = srgb_to_linear(ret); - vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); - float det = min(lod/(proj_lod*0.5), 1.0); - float d = min(dist.x, dist.y); - - d *= min(1, d * (proj_lod - lod)); - + d *= min(1, d * (proj_lod - lod)); float edge = 0.25*det; - ret *= clamp(d/edge, 0.0, 1.0); return ret; @@ -95,7 +91,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); ret = srgb_to_linear(ret); - + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); float det = min(lod/(proj_lod*0.5), 1.0); @@ -137,7 +133,7 @@ void main() { discard; } - + float shadow = 1.0; if (proj_shadow_idx >= 0) @@ -148,9 +144,11 @@ void main() sh[1] = shd.a; shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); } - + vec3 norm = texture2D(normalMap, frag.xy).xyz; + float envIntensity = norm.z; + norm = decode_normal(norm.xy); norm = normalize(norm); @@ -177,24 +175,21 @@ void main() lv = proj_origin-pos.xyz; lv = normalize(lv); float da = dot(norm, lv); - - vec3 col = vec3(0,0,0); - - vec3 diff_tex = texture2D(diffuseRect, frag.xy).rgb; - - vec4 spec = texture2D(specularRect, frag.xy); - float noise = texture2D(noiseMap, frag.xy*noise_scale).b; + vec3 col = vec3(0,0,0); + + vec3 diff_tex = texture2D(diffuseRect, frag.xy).rgb; vec3 dlit = vec3(0, 0, 0); + float noise = texture2D(noiseMap, frag.xy*noise_scale).b; 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 lit = 0.0; + float amb_da = proj_ambiance; if (da > 0.0) { @@ -202,31 +197,34 @@ void main() float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; - + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - + dlit = color.rgb * plcol.rgb * plcol.a; - + col = dlit*lit*diff_tex*shadow; amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; } - + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); - + amb_da += (da*da*0.5+0.5)*proj_ambiance; - + amb_da *= dist_atten * noise; - + amb_da = min(amb_da, 1.0-lit); - - col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; + + col += amb_da*color*diff_tex*amb_plcol.rgb*amb_plcol.a; } - + + + vec4 spec = texture2D(specularRect, frag.xy); if (spec.a > 0.0) { dlit *= min(da*6.0, 1.0) * dist_atten; + vec3 npos = -normalize(pos); //vec3 ref = dot(pos+lv, norm); @@ -239,7 +237,7 @@ void main() float gtdenom = 2 * nh; float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); - + if (nh > 0.0) { float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); @@ -247,10 +245,6 @@ void main() //col += spec.rgb; } } - - - - if (envIntensity > 0.0) { @@ -263,29 +257,24 @@ void main() 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.xy /= stc.w; + stc /= stc.w; - float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); - - //stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); - stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); - if (stc.x < 1.0 && stc.y < 1.0 && stc.x > 0.0 && stc.y > 0.0) { - col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*shadow*spec.rgb; + col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; } } } } - + //not sure why, but this line prevents MATBUG-194 col = max(col, vec3(0.0));