diff options
Diffstat (limited to 'indra/newview/app_settings')
6 files changed, 247 insertions, 119 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c29a3a0035..ffe8762f03 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7518,7 +7518,30 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>SafeMode</key> +  <key>MeshThreadCount</key> +  <map> +    <key>Comment</key> +    <string>Number of threads to use for loading meshes.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>8</integer> +  </map> +  <key>MeshMaxConcurrentRequests</key> +  <map> +    <key>Comment</key> +    <string>Number of threads to use for loading meshes.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>32</integer> +  </map> + +  <key>SafeMode</key>      <map>        <key>Comment</key>        <string>Reset preferences, run in safe mode.</string> @@ -10068,7 +10091,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>1</integer> +      <integer>0</integer>      </map>      <key>SpeakerParticipantRemoveDelay</key>      <map> diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 28bcd720c0..2c8d90d1a6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -5,7 +5,6 @@   * $License$   */ -  #version 120  #extension GL_ARB_texture_rectangle : enable @@ -15,6 +14,7 @@ uniform sampler2DRect specularRect;  uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap;  uniform samplerCube environmentMap; +uniform sampler2DRect lightMap;  uniform sampler2D noiseMap;  uniform sampler2D lightFunc;  uniform sampler2D projectionMap; @@ -26,12 +26,15 @@ 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;  varying vec4 vary_light; @@ -40,6 +43,52 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	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); +	 +	return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	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); +	 +	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 getPosition(vec2 pos_screen)  {  	float depth = texture2DRect(depthMap, pos_screen.xy).a; @@ -68,7 +117,7 @@ void main()  	{  		discard;  	} -	 +		  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz*2.0-1.0;  	norm = normalize(norm); @@ -83,7 +132,11 @@ void main()  	proj_tc.xyz /= proj_tc.w;  	float fa = gl_Color.a+1.0; -	float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); +	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); +	if (dist_atten <= 0.0) +	{ +		discard; +	}  	lv = proj_origin-pos.xyz;  	lv = normalize(lv); @@ -101,32 +154,32 @@ void main()  		proj_tc.y > 0.0)  	{  		float lit = 0.0; +		float amb_da = proj_ambiance; +		  		if (da > 0.0)  		{  			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);  			float lod = diff * proj_lod; -			vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod); +			vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);  			vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;  			lit = da * dist_atten * noise;  			col = lcol*lit*diff_tex; +			amb_da += (da*0.5)*proj_ambiance;  		} -		float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); -		float lod = diff * proj_lod; -		vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod); -		//float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0)); -		float amb_da = 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*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;  	} @@ -144,35 +197,28 @@ void main()  		{  			vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; -			vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz; +			vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));  			if (stc.z > 0.0)  			{ -				stc.xy /= stc.z+proj_near; -					 +				stc.xy /= stc.w; + +				float fatten = clamp(spec.a*spec.a+spec.a*0.5, 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)  				{ -					vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); +					vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);  					col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;  				}  			}  		}  	} -	/*if (spec.a > 0.0) -	{ -		//vec3 ref = reflect(normalize(pos), norm); -		float sa = dot(normalize(lv-normalize(pos)),norm);; -		//sa = max(sa, 0.0); -		//sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0); -		sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); -		sa *= noise; -		col += da*sa*lcol*spec.rgb; -	}*/ -	  	gl_FragColor.rgb = col;	  	gl_FragColor.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl index 22bdd2c7f3..fafc2ae3cc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl @@ -53,51 +53,61 @@ vec4 getPosition(vec2 pos_screen)  //calculate decreases in ambient lighting when crowded out (SSAO)  float calcAmbientOcclusion(vec4 pos, vec3 norm)  { -	vec2 kern[8]; -	// exponentially (^2) distant occlusion samples spread around origin -	kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; -	kern[1] = vec2(1.0, 0.0) * 0.250*0.250; -	kern[2] = vec2(0.0, 1.0) * 0.375*0.375; -	kern[3] = vec2(0.0, -1.0) * 0.500*0.500; -	kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; -	kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; -	kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; -	kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; - -	vec2 pos_screen = vary_fragcoord.xy; -	vec3 pos_world = pos.xyz; -	vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; +	float ret = 1.0; -	float angle_hidden = 0.0; -	int points = 0; +	float dist = dot(pos.xyz,pos.xyz); -	float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); -	 -	// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) -	for (int i = 0; i < 8; i++) +	if (dist < 64.0*64.0)  	{ -		vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect); -		vec3 samppos_world = getPosition(samppos_screen).xyz;  +		vec2 kern[8]; +		// exponentially (^2) distant occlusion samples spread around origin +		kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; +		kern[1] = vec2(1.0, 0.0) * 0.250*0.250; +		kern[2] = vec2(0.0, 1.0) * 0.375*0.375; +		kern[3] = vec2(0.0, -1.0) * 0.500*0.500; +		kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; +		kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; +		kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; +		kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; + +		vec2 pos_screen = vary_fragcoord.xy; +		vec3 pos_world = pos.xyz; +		vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; -		vec3 diff = pos_world - samppos_world; -		float dist2 = dot(diff, diff); +		float angle_hidden = 0.0; +		int points = 0; -		// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area -		// --> solid angle shrinking by the square of distance -		//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 -		//(k should vary inversely with # of samples, but this is taken care of later) +		float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); -		//if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0)  // -0.05*norm to shift sample point back slightly for flat surfaces -		//	angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional.  max of 1.0 (= ssao_factor_inv * ssao_factor) -		angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); +		// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) +		for (int i = 0; i < 8; i++) +		{ +			vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect); +			vec3 samppos_world = getPosition(samppos_screen).xyz;  +			 +			vec3 diff = pos_world - samppos_world; +			float dist2 = dot(diff, diff); +			 +			// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area +			// --> solid angle shrinking by the square of distance +			//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 +			//(k should vary inversely with # of samples, but this is taken care of later) +			 +			//if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0)  // -0.05*norm to shift sample point back slightly for flat surfaces +			//	angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional.  max of 1.0 (= ssao_factor_inv * ssao_factor) +			angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); +			 +			// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  +			points = points + int(diff.z > -1.0); +		} -		// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  -		points = points + int(diff.z > -1.0); +		angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); +		 +		ret = (1.0 - (float(points != 0) * angle_hidden)); +		ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);  	} -	angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); -	 -	return (1.0 - (float(points != 0) * angle_hidden)); +	return min(ret, 1.0);  }  void main()  diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 651959413c..3e29c684e8 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -43,6 +43,52 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	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); +	 +	return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	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); +	 +	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 getPosition(vec2 pos_screen)  {  	float depth = texture2DRect(depthMap, pos_screen.xy).a; @@ -126,7 +172,7 @@ void main()  			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);  			float lod = diff * proj_lod; -			vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod); +			vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);  			vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; @@ -137,7 +183,7 @@ void main()  		}  		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); -		vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, proj_ambient_lod); +		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);  		amb_da += (da*da*0.5+0.5)*proj_ambiance; @@ -167,13 +213,17 @@ void main()  			if (stc.z > 0.0)  			{  				stc.xy /= stc.w; -					 + +				float fatten = clamp(spec.a*spec.a+spec.a*0.5, 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)  				{ -					vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); +					vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);  					col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;  				}  			} diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index d6534083cf..6617e33c0d 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -179,17 +179,6 @@ void main()  		}  	} -	/*if (spec.a > 0.0) -	{ -		//vec3 ref = reflect(normalize(pos), norm); -		float sa = dot(normalize(lv-normalize(pos)),norm);; -		//sa = max(sa, 0.0); -		//sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0); -		sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); -		sa *= noise; -		col += da*sa*lcol*spec.rgb; -	}*/ -	  	//attenuate point light contribution by SSAO component  	col *= texture2DRect(lightMap, frag.xy).g; diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index a0026edcd2..74a948f584 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -55,51 +55,61 @@ vec4 getPosition(vec2 pos_screen)  //calculate decreases in ambient lighting when crowded out (SSAO)  float calcAmbientOcclusion(vec4 pos, vec3 norm)  { -	vec2 kern[8]; -	// exponentially (^2) distant occlusion samples spread around origin -	kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; -	kern[1] = vec2(1.0, 0.0) * 0.250*0.250; -	kern[2] = vec2(0.0, 1.0) * 0.375*0.375; -	kern[3] = vec2(0.0, -1.0) * 0.500*0.500; -	kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; -	kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; -	kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; -	kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; - -	vec2 pos_screen = vary_fragcoord.xy; -	vec3 pos_world = pos.xyz; -	vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; -	 -	float angle_hidden = 0.0; -	int points = 0; +	float ret = 1.0; -	float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); +	float dist = dot(pos.xyz,pos.xyz); -	// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) -	for (int i = 0; i < 8; i++) +	if (dist < 64.0*64.0)  	{ -		vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect); -		vec3 samppos_world = getPosition(samppos_screen).xyz;  +		vec2 kern[8]; +		// exponentially (^2) distant occlusion samples spread around origin +		kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; +		kern[1] = vec2(1.0, 0.0) * 0.250*0.250; +		kern[2] = vec2(0.0, 1.0) * 0.375*0.375; +		kern[3] = vec2(0.0, -1.0) * 0.500*0.500; +		kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; +		kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; +		kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; +		kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; + +		vec2 pos_screen = vary_fragcoord.xy; +		vec3 pos_world = pos.xyz; +		vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; -		vec3 diff = pos_world - samppos_world; -		float dist2 = dot(diff, diff); +		float angle_hidden = 0.0; +		int points = 0; -		// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area -		// --> solid angle shrinking by the square of distance -		//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 -		//(k should vary inversely with # of samples, but this is taken care of later) +		float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); -		//if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0)  // -0.05*norm to shift sample point back slightly for flat surfaces -		//	angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional.  max of 1.0 (= ssao_factor_inv * ssao_factor) -		angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); +		// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) +		for (int i = 0; i < 8; i++) +		{ +			vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect); +			vec3 samppos_world = getPosition(samppos_screen).xyz;  +			 +			vec3 diff = pos_world - samppos_world; +			float dist2 = dot(diff, diff); +			 +			// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area +			// --> solid angle shrinking by the square of distance +			//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 +			//(k should vary inversely with # of samples, but this is taken care of later) +			 +			//if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0)  // -0.05*norm to shift sample point back slightly for flat surfaces +			//	angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional.  max of 1.0 (= ssao_factor_inv * ssao_factor) +			angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); +			 +			// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  +			points = points + int(diff.z > -1.0); +		} -		// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  -		points = points + int(diff.z > -1.0); +		angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); +		 +		ret = (1.0 - (float(points != 0) * angle_hidden)); +		ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);  	} -	angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); -	 -	return (1.0 - (float(points != 0) * angle_hidden)); +	return min(ret, 1.0);  }  float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) @@ -224,11 +234,11 @@ void main()  	//spotlight shadow 1  	vec4 lpos = shadow_matrix[4]*spos; -	gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.1).x;  +	gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8).x;   	//spotlight shadow 2  	lpos = shadow_matrix[5]*spos; -	gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.1).x;  +	gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8).x;   	//gl_FragColor.rgb = pos.xyz;  	//gl_FragColor.b = shadow; | 
