diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class2')
5 files changed, 210 insertions, 47 deletions
| diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index e5edb482a9..08f6ec63fe 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -80,7 +80,7 @@ void main()  	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;  	frag *= screen_res; -	float shadow = 1.0; +	float shadow = 0.0;  	vec4 pos = vec4(vary_position, 1.0);  	vec4 spos = pos; @@ -89,31 +89,65 @@ void main()  	{	  		vec4 lpos; -		if (spos.z < -shadow_clip.z) +		vec4 near_split = shadow_clip*-0.75; +		vec4 far_split = shadow_clip*-1.25; +		vec4 transition_domain = near_split-far_split; +		float weight = 0.0; + +		if (spos.z < near_split.z)  		{  			lpos = shadow_matrix[3]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap3, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +			weight += w;  			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  		} -		else if (spos.z < -shadow_clip.y) + +		if (spos.z < near_split.y && spos.z > far_split.z)  		{  			lpos = shadow_matrix[2]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap2, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +			w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap2, lpos, 0.75)*w; +			weight += w;  		} -		else if (spos.z < -shadow_clip.x) + +		if (spos.z < near_split.x && spos.z > far_split.y)  		{  			lpos = shadow_matrix[1]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap1, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +			w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +			shadow += pcfShadow(shadowMap1, lpos, 0.75)*w; +			weight += w;  		} -		else + +		if (spos.z > far_split.x)  		{  			lpos = shadow_matrix[0]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap0, lpos, 1.5); +				 +			float w = 1.0; +			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +			shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +			weight += w;  		} +		 + +		shadow /= weight; +	} +	else +	{ +		shadow = 1.0;  	}  	vec4 diff = diffuseLookup(vary_texcoord0.xy); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl index c467e6c5cb..aae6a070e2 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl @@ -93,7 +93,7 @@ void main()  	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;  	frag *= screen_res; -	float shadow = 1.0; +	float shadow = 0.0;  	vec4 pos = vec4(vary_position, 1.0);  	vec4 spos = pos; @@ -102,33 +102,68 @@ void main()  	{	  		vec4 lpos; -		if (spos.z < -shadow_clip.z) +		vec4 near_split = shadow_clip*-0.75; +		vec4 far_split = shadow_clip*-1.25; +		vec4 transition_domain = near_split-far_split; +		float weight = 0.0; + +		if (spos.z < near_split.z)  		{  			lpos = shadow_matrix[3]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap3, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +			weight += w;  			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  		} -		else if (spos.z < -shadow_clip.y) + +		if (spos.z < near_split.y && spos.z > far_split.z)  		{  			lpos = shadow_matrix[2]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap2, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +			w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap2, lpos, 0.75)*w; +			weight += w;  		} -		else if (spos.z < -shadow_clip.x) + +		if (spos.z < near_split.x && spos.z > far_split.y)  		{  			lpos = shadow_matrix[1]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap1, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +			w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +			shadow += pcfShadow(shadowMap1, lpos, 0.75)*w; +			weight += w;  		} -		else + +		if (spos.z > far_split.x)  		{  			lpos = shadow_matrix[0]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap0, lpos, 1.5); +				 +			float w = 1.0; +			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +			shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +			weight += w;  		} +		 + +		shadow /= weight; +  	} -	 +	else +	{ +		shadow = 1.0; +	} +  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  	vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl index 8aaf87a1b5..931577359e 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl @@ -92,7 +92,7 @@ void main()  	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;  	frag *= screen_res; -	float shadow = 1.0; +	float shadow = 0.0;  	vec4 pos = vec4(vary_position, 1.0);  	vec4 spos = pos; @@ -101,31 +101,65 @@ void main()  	{	  		vec4 lpos; -		if (spos.z < -shadow_clip.z) +		vec4 near_split = shadow_clip*-0.75; +		vec4 far_split = shadow_clip*-1.25; +		vec4 transition_domain = near_split-far_split; +		float weight = 0.0; + +		if (spos.z < near_split.z)  		{  			lpos = shadow_matrix[3]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap3, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +			weight += w;  			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  		} -		else if (spos.z < -shadow_clip.y) + +		if (spos.z < near_split.y && spos.z > far_split.z)  		{  			lpos = shadow_matrix[2]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap2, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +			w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap2, lpos, 0.75)*w; +			weight += w;  		} -		else if (spos.z < -shadow_clip.x) + +		if (spos.z < near_split.x && spos.z > far_split.y)  		{  			lpos = shadow_matrix[1]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap1, lpos, 1.5); + +			float w = 1.0; +			w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +			w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +			shadow += pcfShadow(shadowMap1, lpos, 0.75)*w; +			weight += w;  		} -		else + +		if (spos.z > far_split.x)  		{  			lpos = shadow_matrix[0]*spos;  			lpos.xy *= shadow_res; -			shadow = pcfShadow(shadowMap0, lpos, 1.5); +				 +			float w = 1.0; +			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +			shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +			weight += w;  		} +		 + +		shadow /= weight; +	} +	else +	{ +		shadow = 1.0;  	}  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index a40b29d2c4..8c4ccf9cb3 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -135,7 +135,7 @@ void main()  		return;  	}*/ -	float shadow = 1.0; +	float shadow = 0.0;  	float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));  	vec3 shadow_pos = pos.xyz + displace*norm; @@ -154,32 +154,62 @@ void main()  		{  			vec4 lpos; -			if (spos.z < -shadow_clip.z) +			vec4 near_split = shadow_clip*-0.75; +			vec4 far_split = shadow_clip*-1.25; +			vec4 transition_domain = near_split-far_split; +			float weight = 0.0; + +			if (spos.z < near_split.z)  			{  				lpos = shadow_matrix[3]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap3, lpos, 0.25); + +				float w = 1.0; +				w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +				weight += w;  				shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  			} -			else if (spos.z < -shadow_clip.y) + +			if (spos.z < near_split.y && spos.z > far_split.z)  			{  				lpos = shadow_matrix[2]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap2, lpos, 0.5); + +				float w = 1.0; +				w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +				w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap2, lpos, 0.75)*w; +				weight += w;  			} -			else if (spos.z < -shadow_clip.x) + +			if (spos.z < near_split.x && spos.z > far_split.y)  			{  				lpos = shadow_matrix[1]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap1, lpos, 0.75); + +				float w = 1.0; +				w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +				w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +				shadow += pcfShadow(shadowMap1, lpos, 0.75)*w; +				weight += w;  			} -			else + +			if (spos.z > far_split.x)  			{  				lpos = shadow_matrix[0]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap0, lpos, 1.0); +				 +				float w = 1.0; +				w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +				shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +				weight += w;  			} + +			shadow /= weight; +  			// take the most-shadowed value out of these two:  			//  * the blurred sun shadow in the light (shadow) map  			//  * an unblurred dot product between the sun and this norm diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 774f70262a..02075a7687 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -196,7 +196,7 @@ void main()  		return;  	}*/ -	float shadow = 1.0; +	float shadow = 0.0;  	float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));  	vec3 shadow_pos = pos.xyz + displace*norm; @@ -214,33 +214,63 @@ void main()  		else  		{  			vec4 lpos; -			 -			if (spos.z < -shadow_clip.z) + +			vec4 near_split = shadow_clip*-0.75; +			vec4 far_split = shadow_clip*-1.25; +			vec4 transition_domain = near_split-far_split; +			float weight = 0.0; + +			if (spos.z < near_split.z)  			{  				lpos = shadow_matrix[3]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap3, lpos, 0.25); + +				float w = 1.0; +				w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +				weight += w;  				shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  			} -			else if (spos.z < -shadow_clip.y) + +			if (spos.z < near_split.y && spos.z > far_split.z)  			{  				lpos = shadow_matrix[2]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap2, lpos, 0.5); + +				float w = 1.0; +				w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +				w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap2, lpos, 0.75)*w; +				weight += w;  			} -			else if (spos.z < -shadow_clip.x) + +			if (spos.z < near_split.x && spos.z > far_split.y)  			{  				lpos = shadow_matrix[1]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap1, lpos, 0.75); + +				float w = 1.0; +				w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +				w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +				shadow += pcfShadow(shadowMap1, lpos, 0.75)*w; +				weight += w;  			} -			else + +			if (spos.z > far_split.x)  			{  				lpos = shadow_matrix[0]*spos;  				lpos.xy *= shadow_res; -				shadow = pcfShadow(shadowMap0, lpos, 1.0); +				 +				float w = 1.0; +				w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +				shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +				weight += w;  			} + +			shadow /= weight; +  			// take the most-shadowed value out of these two:  			//  * the blurred sun shadow in the light (shadow) map  			//  * an unblurred dot product between the sun and this norm | 
