diff options
| author | Graham Linden <graham@lindenlab.com> | 2019-03-27 09:38:26 -0700 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2019-03-27 09:38:26 -0700 | 
| commit | 09981714c306b9bf89a8e65c49318ccc6c30580f (patch) | |
| tree | 391eeba3f3e6469c8c1185c90e5ba05b36ae1637 /indra/newview/app_settings/shaders/class3/deferred | |
| parent | 9dee4149ae6f33e2f82b8986b041df311f0cbe88 (diff) | |
Fix projector falloff and attenuation handling.
Diffstat (limited to 'indra/newview/app_settings/shaders/class3/deferred')
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl | 369 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl | 373 | 
2 files changed, 370 insertions, 372 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl index 0c113282b5..dec9afcfb7 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl @@ -77,59 +77,59 @@ vec3 getNorm(vec2 pos_screen);  vec4 correctWithGamma(vec4 col)  { -	return vec4(srgb_to_linear(col.rgb), col.a); +    return vec4(srgb_to_linear(col.rgb), col.a);  }  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  { -	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret.rgb = srgb_to_linear(ret.rgb); -	 -	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); +    vec4 ret = texture2DLod(projectionMap, tc, lod); +    ret.rgb = srgb_to_linear(ret.rgb); +     +    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; +    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 = correctWithGamma(ret); +    vec4 ret = texture2DLod(projectionMap, tc, lod); +    ret = correctWithGamma(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); -	 -	float edge = 0.25*det; -		 -	ret *= clamp(d/edge, 0.0, 1.0); -	 -	return 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); +     +    float edge = 0.25*det; +         +    ret *= clamp(d/edge, 0.0, 1.0); +     +    return ret;  }  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  { -	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +    vec4 ret = texture2DLod(projectionMap, tc, lod); +    ret = correctWithGamma(ret); -	vec2 dist = tc-vec2(0.5); -	 -	float d = dot(dist,dist); -		 -	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); -	 -	return ret; +    vec2 dist = tc-vec2(0.5); +     +    float d = dot(dist,dist); +         +    ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); +     +    return ret;  } @@ -137,167 +137,166 @@ vec4 getPosition(vec2 pos_screen);  void main()   { -	vec4 frag = vary_fragcoord; -	frag.xyz /= frag.w; -	frag.xyz = frag.xyz*0.5+0.5; -	frag.xy *= screen_res; -	 -	vec3 pos = getPosition(frag.xy).xyz; -	vec3 lv = center.xyz-pos.xyz; -	float dist = length(lv); -	dist /= size; -	if (dist > 1.0) -	{ -		discard; -	} -	 -	float shadow = 1.0; -	 -	if (proj_shadow_idx >= 0) -	{ -		vec4 shd = texture2DRect(lightMap, frag.xy); -		float sh[2]; -		sh[0] = shd.b; -		sh[1] = shd.a; -		shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); -	} -	 -	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; -	 -	float envIntensity = norm.z; +    vec4 frag = vary_fragcoord; +    frag.xyz /= frag.w; +    frag.xyz = frag.xyz*0.5+0.5; +    frag.xy *= screen_res; +     +    vec3 pos = getPosition(frag.xy).xyz; +    vec3 lv = center.xyz-pos.xyz; +    float dist = length(lv); +    dist /= size; +    if (dist > 1.0) +    { +        discard; +    } +     +    float shadow = 1.0; +     +    if (proj_shadow_idx >= 0) +    { +        vec4 shd = texture2DRect(lightMap, frag.xy); +        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a; +        shadow = clamp(shadow, 0.0, 1.0); +        shadow += shadow_fade; +    } +     +    vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +     +    float envIntensity = norm.z; -	norm = getNorm(frag.xy); -	 -	norm = normalize(norm); -	float l_dist = -dot(lv, proj_n); -	 -	vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); -	if (proj_tc.z < 0.0) -	{ -		discard; -	} -	 -	proj_tc.xyz /= proj_tc.w; -	 -	float fa = falloff+1.0; -	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); -	dist_atten *= dist_atten; -	dist_atten *= 2.0; -	if (dist_atten <= 0.0) -	{ -		discard; -	} -	 -	lv = proj_origin-pos.xyz; -	lv = normalize(lv); -	float da = dot(norm, lv); +    norm = getNorm(frag.xy); +     +    norm = normalize(norm); +    float l_dist = -dot(lv, proj_n); +     +    vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); +    if (proj_tc.z < 0.0) +    { +        discard; +    } +     +    proj_tc.xyz /= proj_tc.w; +     +    float fa = (falloff*0.5)+1.0; +    float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); +    dist_atten *= dist_atten; +    dist_atten *= 2.0; +    if (dist_atten <= 0.0) +    { +        discard; +    } +     +    lv = proj_origin-pos.xyz; +    lv = normalize(lv); +    float da = dot(norm, lv); -	vec3 col = vec3(0,0,0); -		 -	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -	 -	vec4 spec = texture2DRect(specularRect, frag.xy); +    vec3 col = vec3(0,0,0); +         +    vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; +     +    vec4 spec = texture2DRect(specularRect, frag.xy); -	vec3 dlit = vec3(0, 0, 0); +    vec3 dlit = vec3(0, 0, 0); -	float noise = texture2D(noiseMap, frag.xy/128.0).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 noise = texture2D(noiseMap, frag.xy/128.0).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; -		if (da > 0.0) -		{ -			lit = da * dist_atten * noise; +        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; -			 -			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)*(1.0-shadow)*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; -	} -	 +            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)*(1.0-shadow)*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; +    } +     -	if (spec.a > 0.0) -	{ -		vec3 npos = -normalize(pos); -		dlit *= min(da*6.0, 1.0) * dist_atten; +    if (spec.a > 0.0) +    { +        vec3 npos = -normalize(pos); +        dlit *= min(da*6.0, 1.0) * dist_atten; -		//vec3 ref = dot(pos+lv, norm); -		vec3 h = normalize(lv+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; +        //vec3 ref = dot(pos+lv, norm); +        vec3 h = normalize(lv+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; -		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*shadow; -			//col += spec.rgb; -		} -	}	 -	 -	 -	 -	 +        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*shadow; +            //col += spec.rgb; +        } +    }    +     +     +     +     -	if (envIntensity > 0.0) -	{ -		vec3 ref = reflect(normalize(pos), norm); -		 -		//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 (envIntensity > 0.0) +    { +        vec3 ref = reflect(normalize(pos), norm); +         +        //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) -			{ +            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) -				{ -					col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; -				} -			} -		} -	} +                                 +                if (stc.x < 1.0 && +                    stc.y < 1.0 && +                    stc.x > 0.0 && +                    stc.y > 0.0) +                { +                    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)); +    //not sure why, but this line prevents MATBUG-194 +    col = max(col, vec3(0.0)); -	frag_color.rgb = col;	 -	frag_color.a = 0.0; +    frag_color.rgb = col;    +    frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl index 00b276f585..6a813cac15 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -77,59 +77,59 @@ vec3 linear_to_srgb(vec3 cl);  vec4 correctWithGamma(vec4 col)  { -	return vec4(srgb_to_linear(col.rgb), col.a); +    return vec4(srgb_to_linear(col.rgb), col.a);  }  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  { -	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret.rgb = srgb_to_linear(ret.rgb); -	 -	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); +    vec4 ret = texture2DLod(projectionMap, tc, lod); +    ret.rgb = srgb_to_linear(ret.rgb); +     +    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; +    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 = correctWithGamma(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); -	 -	float edge = 0.25*det; -		 -	ret *= clamp(d/edge, 0.0, 1.0); -	 -	return ret; +    vec4 ret = texture2DLod(projectionMap, tc, lod); +    ret = correctWithGamma(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); +     +    float edge = 0.25*det; +         +    ret *= clamp(d/edge, 0.0, 1.0); +     +    return ret;  }  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  { -	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); -	 -	vec2 dist = tc-vec2(0.5); -	 -	float d = dot(dist,dist); -		 -	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); -	 -	return ret; +    vec4 ret = texture2DLod(projectionMap, tc, lod); +    ret = correctWithGamma(ret); +     +    vec2 dist = tc-vec2(0.5); +     +    float d = dot(dist,dist); +         +    ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); +     +    return ret;  } @@ -137,163 +137,162 @@ vec4 getPosition(vec2 pos_screen);  void main()   { -	vec4 frag = vary_fragcoord; -	frag.xyz /= frag.w; -	frag.xyz = frag.xyz*0.5+0.5; -	frag.xy *= screen_res; -	 -	vec3 pos = getPosition(frag.xy).xyz; -	vec3 lv = trans_center.xyz-pos.xyz; -	float dist = length(lv); -	dist /= size; -	if (dist > 1.0) -	{ -		discard; -	} -	 -	float shadow = 1.0; -	 -	if (proj_shadow_idx >= 0) -	{ -		vec4 shd = texture2DRect(lightMap, frag.xy); -		float sh[2]; -		sh[0] = shd.b; -		sh[1] = shd.a; -		shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); -	} -	 -	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; -	float envIntensity = norm.z; -	norm = getNorm(frag.xy); -	 -	norm = normalize(norm); -	float l_dist = -dot(lv, proj_n); -	 -	vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); -	if (proj_tc.z < 0.0) -	{ -		discard; -	} -	 -	proj_tc.xyz /= proj_tc.w; -	 -	float fa = falloff + 1.0; -	float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0); -	dist_atten *= dist_atten; -	dist_atten *= 2.0; +    vec4 frag = vary_fragcoord; +    frag.xyz /= frag.w; +    frag.xyz = frag.xyz*0.5+0.5; +    frag.xy *= screen_res; +     +    vec3 pos = getPosition(frag.xy).xyz; +    vec3 lv = trans_center.xyz-pos.xyz; +    float dist = length(lv); +    dist /= size; +    if (dist > 1.0) +    { +        discard; +    } +     +    float shadow = 1.0; +     +    if (proj_shadow_idx >= 0) +    { +        vec4 shd = texture2DRect(lightMap, frag.xy); +        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a; +        shadow = clamp(shadow, 0.0, 1.0); +        shadow += shadow_fade; +    } +     +    vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +    float envIntensity = norm.z; +    norm = getNorm(frag.xy); +     +    norm = normalize(norm); +    float l_dist = -dot(lv, proj_n); +     +    vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); +    if (proj_tc.z < 0.0) +    { +        discard; +    } +     +    proj_tc.xyz /= proj_tc.w; +     +    float fa = (falloff*0.5) + 1.0; +    float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0); +    dist_atten *= dist_atten; +    dist_atten *= 2.0; -	if (dist_atten <= 0.0) -	{ -		discard; -	} -	 -	lv = proj_origin-pos.xyz; -	lv = normalize(lv); -	float da = dot(norm, lv); -		 -	vec3 col = vec3(0,0,0); -		 -	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -		 -	vec4 spec = texture2DRect(specularRect, frag.xy); +    if (dist_atten <= 0.0) +    { +        discard; +    } +     +    lv = proj_origin-pos.xyz; +    lv = normalize(lv); +    float da = dot(norm, lv); +         +    vec3 col = vec3(0,0,0); +         +    vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; +         +    vec4 spec = texture2DRect(specularRect, frag.xy); -	vec3 dlit = vec3(0, 0, 0); +    vec3 dlit = vec3(0, 0, 0); -	float noise = texture2D(noiseMap, frag.xy/128.0).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; -		 -		if (da > 0.0) -		{ -			lit = da * dist_atten * noise; +    float noise = texture2D(noiseMap, frag.xy/128.0).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; +         +        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; -			 -			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)*(1.0-shadow)*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; -	} -	 +            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)*(1.0-shadow)*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; +    } +     -	if (spec.a > 0.0) -	{ -		dlit *= min(da*6.0, 1.0) * dist_atten; -		vec3 npos = -normalize(pos); +    if (spec.a > 0.0) +    { +        dlit *= min(da*6.0, 1.0) * dist_atten; +        vec3 npos = -normalize(pos); -		//vec3 ref = dot(pos+lv, norm); -		vec3 h = normalize(lv+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; +        //vec3 ref = dot(pos+lv, norm); +        vec3 h = normalize(lv+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; -		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*shadow; -			//col += spec.rgb; -		} -	}	 -	 +        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*shadow; +            //col += spec.rgb; +        } +    }    +     -	if (envIntensity > 0.0) -	{ -		vec3 ref = reflect(normalize(pos), norm); -		 -		//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 (envIntensity > 0.0) +    { +        vec3 ref = reflect(normalize(pos), norm); +         +        //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) -				{ -					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)); +            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) +                { +                    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)); -	frag_color.rgb = col;	 -	frag_color.a = 0.0; +    frag_color.rgb = col;    +    frag_color.a = 0.0;  } | 
