diff options
| author | Adam Moss <c@yotes.com> | 2012-04-21 17:35:50 +0100 | 
|---|---|---|
| committer | Adam Moss <c@yotes.com> | 2012-04-21 17:35:50 +0100 | 
| commit | 9ce481a5ac41777539416da3e0ec92b098af3e49 (patch) | |
| tree | ecbfe2c2ad172d52c12807c49c8ca0c741e6af91 | |
| parent | 19e0cc93a8af661dbac47552474a704ade600c74 (diff) | |
STORM-1819: Ternary/graded shadow support
Coalesced patchset.
11 files changed, 184 insertions, 98 deletions
| diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 7d384450e6..5a6e6cab3e 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1062,8 +1062,9 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("proj_shadow_res");  	mReservedUniforms.push_back("depth_cutoff");  	mReservedUniforms.push_back("norm_cutoff"); +	mReservedUniforms.push_back("shadow_target_width"); -	llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_NORM_CUTOFF+1); +	llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH+1);  	mReservedUniforms.push_back("tc_scale");  	mReservedUniforms.push_back("rcp_screen_res"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index e28bda6de2..f792faa8f0 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -130,6 +130,7 @@ public:  		DEFERRED_PROJ_SHADOW_RES,  		DEFERRED_DEPTH_CUTOFF,  		DEFERRED_NORM_CUTOFF, +		DEFERRED_SHADOW_TARGET_WIDTH,  		FXAA_TC_SCALE,  		FXAA_RCP_SCREEN_RES, diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl index cf8cf8364a..07d5b08191 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -29,11 +29,18 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif +uniform mat4 modelview_projection_matrix; +  uniform float minimum_alpha;  uniform sampler2D diffuseMap; -VARYING vec4 post_pos; +//flat VARYING int foo; +VARYING float pos_zd2; +VARYING float pos_w; +VARYING float target_pos_x; +//VARYING vec4 pre_pos; +//VARYING vec4 post_pos;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; @@ -41,12 +48,20 @@ void main()  {  	float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a; -	if (alpha < minimum_alpha) +	if (alpha < 0.05) // treat as totally transparent  	{  		discard;  	} +	if (alpha < 0.88) // treat as semi-transparent +	{ +	  if (fract(0.5*floor(target_pos_x / pos_w )) < 0.25) +	  { +	    discard; +	  } +	} +  	frag_color = vec4(1,1,1,1); -	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +	gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl index 7d3b06c56e..6397a5c461 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl @@ -25,12 +25,18 @@  uniform mat4 texture_matrix0;  uniform mat4 modelview_projection_matrix; +uniform float shadow_target_width;  ATTRIBUTE vec3 position;  ATTRIBUTE vec4 diffuse_color;  ATTRIBUTE vec2 texcoord0; -VARYING vec4 post_pos; +VARYING float pos_zd2; +VARYING float pos_w; +VARYING float target_pos_x; +//flat VARYING int foo; +//VARYING vec4 pre_pos; +//VARYING vec4 post_pos;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; @@ -39,8 +45,13 @@ void passTextureIndex();  void main()  {  	//transform vertex -	vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0); -	post_pos = pos; +	vec4 pre_pos = vec4(position.xyz, 1.0); +	vec4 pos = modelview_projection_matrix * pre_pos; +	//post_pos = pos; +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; +	pos_w = pos.w; +	pos_zd2 = pos.z * 0.5; +	//foo = int(posxw.x);  	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 08f6ec63fe..70a5912258 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -58,20 +58,28 @@ uniform float shadow_bias;  uniform mat4 inv_proj; -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +float mex(float a, float b) +{ +  return a; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc)  {  	stc.xyz /= stc.w;  	stc.z += shadow_bias; + +	//stc.x = floor(stc.x + fract(stc.y) * 1.5); +	stc.x = floor(stc.x + fract(stc.y*12345));  	float cs = shadow2DRect(shadowMap, stc.xyz).x;  	float shadow = cs; -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs); -			 -	return shadow/5.0; +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x,cs); +                         +        return shadow*0.2;  } @@ -101,7 +109,7 @@ void main()  			float w = 1.0;  			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -			shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +			shadow += pcfShadow(shadowMap3, lpos)*w;  			weight += w;  			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  		} @@ -114,7 +122,7 @@ void main()  			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; +			shadow += pcfShadow(shadowMap2, lpos)*w;  			weight += w;  		} @@ -126,7 +134,7 @@ void main()  			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; +			shadow += pcfShadow(shadowMap1, lpos)*w;  			weight += w;  		} @@ -138,7 +146,7 @@ void main()  			float w = 1.0;  			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; -			shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +			shadow += pcfShadow(shadowMap0, lpos)*w;  			weight += w;  		} diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl index aae6a070e2..5fc4fd72ef 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl @@ -71,20 +71,28 @@ vec4 getPosition(vec2 pos_screen)  	return pos;  } -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +float mex(float a, float b) +{ +  return a; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc)  {  	stc.xyz /= stc.w;  	stc.z += shadow_bias; + +	//stc.x = floor(stc.x + fract(stc.y) * 1.5); +	stc.x = floor(stc.x + fract(stc.y*12345));  	float cs = shadow2DRect(shadowMap, stc.xyz).x;  	float shadow = cs; -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs); -			 -	return shadow/5.0; +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x,cs); +                         +        return shadow*0.2;  } @@ -114,7 +122,7 @@ void main()  			float w = 1.0;  			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -			shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +			shadow += pcfShadow(shadowMap3, lpos)*w;  			weight += w;  			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  		} @@ -127,7 +135,7 @@ void main()  			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; +			shadow += pcfShadow(shadowMap2, lpos)*w;  			weight += w;  		} @@ -139,7 +147,7 @@ void main()  			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; +			shadow += pcfShadow(shadowMap1, lpos)*w;  			weight += w;  		} @@ -151,7 +159,7 @@ void main()  			float w = 1.0;  			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; -			shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +			shadow += pcfShadow(shadowMap0, lpos)*w;  			weight += w;  		} diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl index 931577359e..785d50b853 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl @@ -70,20 +70,28 @@ vec4 getPosition(vec2 pos_screen)  	return pos;  } -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +float mex(float a, float b) +{ +  return a; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc)  {  	stc.xyz /= stc.w;  	stc.z += shadow_bias; + +	//stc.x = floor(stc.x + fract(stc.y) * 1.5); +	stc.x = floor(stc.x + fract(stc.y*12345));  	float cs = shadow2DRect(shadowMap, stc.xyz).x;  	float shadow = cs; -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs); -			 -	return shadow/5.0; +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x,cs); +                         +        return shadow*0.2;  } @@ -113,7 +121,7 @@ void main()  			float w = 1.0;  			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -			shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +			shadow += pcfShadow(shadowMap3, lpos)*w;  			weight += w;  			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  		} @@ -126,7 +134,7 @@ void main()  			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; +			shadow += pcfShadow(shadowMap2, lpos)*w;  			weight += w;  		} @@ -138,7 +146,7 @@ void main()  			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; +			shadow += pcfShadow(shadowMap1, lpos)*w;  			weight += w;  		} @@ -150,7 +158,7 @@ void main()  			float w = 1.0;  			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; -			shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +			shadow += pcfShadow(shadowMap0, lpos)*w;  			weight += w;  		} diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 8c4ccf9cb3..b0034addb5 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -78,42 +78,56 @@ vec4 getPosition(vec2 pos_screen)  	return pos;  } -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +float mex(float a, float b) +{ +  return a; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)  {  	stc.xyz /= stc.w;  	stc.z += shadow_bias*scl; -	 + +	////stc.x = floor(stc.x + fract(stc.y*12345)); +	//stc.x = floor(stc.x + fract(stc.y)); +	  stc.x = floor(stc.x + fract(pos_screen.y*0.666666666)); + +	//stc.x = floor(stc.x); +	//stc.y = floor(stc.y); + +	//stc.x += 0.5; +  	float cs = shadow2DRect(shadowMap, stc.xyz).x;  	float shadow = cs; -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs); -			 -	return shadow/5.0; -	  	//return shadow; + +	shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x,cs); +	shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x,cs); +	shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, 1.5, 0.0)).x,cs); +	shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, -1.5, 0.0)).x,cs); +			 +        return shadow*0.2;  } -float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl) +float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)  {  	stc.xyz /= stc.w;  	stc.z += spot_shadow_bias*scl; +	stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap  	float cs = shadow2D(shadowMap, stc.xyz).x;  	float shadow = cs; -	vec2 off = 1.5/proj_shadow_res; +	vec2 off = 1.0/proj_shadow_res; +	off.y *= 1.5; -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs); -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs); -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs); -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs); -				 -	return shadow/5.0; -	 -	//return shadow; +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x, cs); +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs); +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs); +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x, cs); + +        return shadow*0.2;  }  void main()  @@ -166,7 +180,7 @@ void main()  				float w = 1.0;  				w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -				shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +				shadow += pcfShadow(shadowMap3, lpos, 0.25, pos_screen)*w;  				weight += w;  				shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  			} @@ -179,7 +193,7 @@ void main()  				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; +				shadow += pcfShadow(shadowMap2, lpos, 0.5, pos_screen)*w;  				weight += w;  			} @@ -191,7 +205,7 @@ void main()  				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; +				shadow += pcfShadow(shadowMap1, lpos, 0.75, pos_screen)*w;  				weight += w;  			} @@ -203,7 +217,7 @@ void main()  				float w = 1.0;  				w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; -				shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +				shadow += pcfShadow(shadowMap0, lpos, 1.0, pos_screen)*w;  				weight += w;  			} @@ -237,11 +251,11 @@ void main()  	//spotlight shadow 1  	vec4 lpos = shadow_matrix[4]*spos; -	frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8);  +	frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8, pos_screen);   	//spotlight shadow 2  	lpos = shadow_matrix[5]*spos; -	frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8);  +	frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8, pos_screen);   	//frag_color.rgb = pos.xyz;  	//frag_color.b = shadow; diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 02075a7687..8aee76d033 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -90,7 +90,7 @@ vec2 getKern(int i)  	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; -	 +         	return kern[i];  } @@ -139,42 +139,47 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)  	return min(ret, 1.0);  } -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +float mex(float a, float b) +{ +  return a; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)  {  	stc.xyz /= stc.w;  	stc.z += shadow_bias*scl; + +	stc.x = floor(stc.x + fract(pos_screen.y*0.666666666));  	float cs = shadow2DRect(shadowMap, stc.xyz).x;  	float shadow = cs; - -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs); -	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs); -			 -	return shadow/5.0; -	//return shadow; +	shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x,cs); +        shadow += mex(shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x,cs); +                         +        return shadow*0.2;  } -float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl) +float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)  {  	stc.xyz /= stc.w;  	stc.z += spot_shadow_bias*scl; +	stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap  	float cs = shadow2D(shadowMap, stc.xyz).x;  	float shadow = cs; -	vec2 off = 1.5/proj_shadow_res; -	 -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs); -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs); -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs); -	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs); +	vec2 off = 1.0/proj_shadow_res; +	off.y *= 1.5; -	return shadow/5.0; -	 -	//return shadow; +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x, cs); +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs); +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs); +	shadow += mex(shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x, cs); + +        return shadow*0.2;  }  void main()  @@ -227,7 +232,7 @@ void main()  				float w = 1.0;  				w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -				shadow += pcfShadow(shadowMap3, lpos, 0.25)*w; +				shadow += pcfShadow(shadowMap3, lpos, 0.25, pos_screen)*w;  				weight += w;  				shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);  			} @@ -240,7 +245,7 @@ void main()  				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; +				shadow += pcfShadow(shadowMap2, lpos, 0.5, pos_screen)*w;  				weight += w;  			} @@ -252,7 +257,7 @@ void main()  				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; +				shadow += pcfShadow(shadowMap1, lpos, 0.75, pos_screen)*w;  				weight += w;  			} @@ -264,7 +269,7 @@ void main()  				float w = 1.0;  				w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; -				shadow += pcfShadow(shadowMap0, lpos, 1.0)*w; +				shadow += pcfShadow(shadowMap0, lpos, 1.0, pos_screen)*w;  				weight += w;  			} @@ -298,11 +303,11 @@ void main()  	//spotlight shadow 1  	vec4 lpos = shadow_matrix[4]*spos; -	frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8);  +	frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8, pos_screen);  	//spotlight shadow 2  	lpos = shadow_matrix[5]*spos; -	frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8);  +	frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8, pos_screen);  	//frag_color.rgb = pos.xyz;  	//frag_color.b = shadow; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index ab994c71cb..22a1a5b45a 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -425,6 +425,8 @@ LLPipeline::LLPipeline() :  	mLightingDetail(0),  	mScreenWidth(0),  	mScreenHeight(0) +	//	mSunShadowMapWidth(0), +	//	mSpotShadowMapWidth(0)  {  	mNoiseMap = 0;  	mTrueNoiseMap = 0; @@ -738,6 +740,8 @@ void LLPipeline::allocatePhysicsBuffer()  void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  { +	llwarns << "ALLOCATING SCREEN BUFFER, " << resX << "x" << resY << llendl; +  	refreshCachedSettings();  	U32 samples = RenderFSAASamples; @@ -787,6 +791,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  { +	llwarns << "ALLOCATING SCREEN BUFFER, " << resX << "x" << resY << llendl;  	refreshCachedSettings();  	// remember these dimensions @@ -846,9 +851,10 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  		if (shadow_detail > 0)  		{ //allocate 4 sun shadow maps +			U32 mSunShadowMapWidth = ((U32(resX*scale)+1)&~1); // must be even to avoid a stripe in the horizontal shadow blur  			for (U32 i = 0; i < 4; i++)  			{ -				if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false; +				if (!mShadow[i].allocate(mSunShadowMapWidth,U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  			}  		}  		else @@ -857,6 +863,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  			{  				mShadow[i].release();  			} +			//mSunShadowMapWidth = 0;  		}  		U32 width = nhpo2(U32(resX*scale))/2; @@ -864,9 +871,10 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  		if (shadow_detail > 1)  		{ //allocate two spot shadow maps +			U32 mSpotShadowMapWidth = width;  			for (U32 i = 4; i < 6; i++)  			{ -				if (!mShadow[i].allocate(width, height, 0, TRUE, FALSE)) return false; +				if (!mShadow[i].allocate(mSpotShadowMapWidth, height, 0, TRUE, FALSE)) return false;  			}  		}  		else @@ -875,6 +883,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  			{  				mShadow[i].release();  			} +			//mSpotShadowMapWidth = 0;  		}  		// don't disable shaders on next session @@ -8293,7 +8302,7 @@ static LLFastTimer::DeclareTimer FTM_SHADOW_RENDER("Render Shadows");  static LLFastTimer::DeclareTimer FTM_SHADOW_ALPHA("Alpha Shadow");  static LLFastTimer::DeclareTimer FTM_SHADOW_SIMPLE("Simple Shadow"); -void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult &result, BOOL use_shader, BOOL use_occlusion) +void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult &result, BOOL use_shader, BOOL use_occlusion, U32 target_width)  {  	LLFastTimer t(FTM_SHADOW_RENDER); @@ -8384,7 +8393,9 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  		LLFastTimer ftm(FTM_SHADOW_ALPHA);  		gDeferredShadowAlphaMaskProgram.bind();  		gDeferredShadowAlphaMaskProgram.setMinimumAlpha(0.598f); -		 +		gDeferredShadowAlphaMaskProgram.uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +		//		llwarns << "target_width is " << target_width << llendl; +  		U32 mask =	LLVertexBuffer::MAP_VERTEX |   					LLVertexBuffer::MAP_TEXCOORD0 |   					LLVertexBuffer::MAP_COLOR |  @@ -9237,11 +9248,13 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  			mShadow[j].getViewport(gGLViewport);  			mShadow[j].clear(); +			U32 target_width = mShadow[j].getWidth(); +  			{  				static LLCullResult result[4];  				//LLGLEnable enable(GL_DEPTH_CLAMP_NV); -				renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE); +				renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE, TRUE, target_width);  			}  			mShadow[j].flush(); @@ -9380,11 +9393,13 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  			mShadow[i+4].getViewport(gGLViewport);  			mShadow[i+4].clear(); +			U32 target_width = mShadow[i+4].getWidth(); +  			static LLCullResult result[2];  			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4; -			renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE); +			renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE, target_width);  			mShadow[i+4].flush();   		} diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index b8b4f164fe..201952876f 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -264,7 +264,7 @@ public:  	void setHighlightObject(LLDrawable* obj) { mHighlightObject = obj; } -	void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, BOOL use_shader = TRUE, BOOL use_occlusion = TRUE); +	void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, BOOL use_shader, BOOL use_occlusion, U32 target_width);  	void renderHighlights();  	void renderDebug();  	void renderPhysicsDisplay(); | 
