diff options
| author | Dave Parks <davep@lindenlab.com> | 2011-12-08 17:49:56 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2011-12-08 17:49:56 -0600 | 
| commit | ca4eab69b9b1ed42f3128635ef1f278600b59118 (patch) | |
| tree | 1c77706223770593008c64b92711cb85f4e79896 | |
| parent | f9f247c5a6f2f7d3b730244f8fc10c880cdb1bed (diff) | |
SH-2680 Bring back blurred edges on objects closer than the near focal plane.
3 files changed, 41 insertions, 8 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl index 88fe3c3dee..e612efba61 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl @@ -57,7 +57,7 @@ float getDepth(vec2 pos_screen)  float calc_cof(float depth)  { -	float sc = abs(depth-focal_distance)/-depth*blur_constant; +	float sc = (depth-focal_distance)/-depth*blur_constant;  	sc /= magnification; @@ -79,9 +79,10 @@ void main()  	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);  	float sc = calc_cof(depth); -	sc = min(abs(sc), max_cof); +	sc = min(sc, max_cof); +	sc = max(sc, -max_cof);  	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);  	gl_FragColor.rgb = diff.rgb + bloom.rgb; -	gl_FragColor.a = sc/max_cof; +	gl_FragColor.a = sc/max_cof*0.5+0.5;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl b/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl index 21453aefaa..01e3505359 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl @@ -48,7 +48,7 @@ void main()  	vec4 diff = texture2DRect(lightMap, vary_fragcoord.xy); -	float a = min(diff.a * max_cof*res_scale*res_scale, 1.0); +	float a = min(abs(diff.a*2.0-1.0) * max_cof*res_scale*res_scale, 1.0);  	if (a > 0.25 && a < 0.75)  	{ //help out the transition a bit diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 4603d99c5e..18d451bf87 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -42,7 +42,7 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)  {  	vec4 s = texture2DRect(diffuseRect, tc); -	float sc = s.a*max_cof; +	float sc = abs(s.a*2.0-1.0)*max_cof;  	if (sc > min_sc) //sampled pixel is more "out of focus" than current sample radius  	{ @@ -57,6 +57,20 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)  	}  } +void dofSampleNear(inout vec4 diff, inout float w, float min_sc, vec2 tc) +{ +	vec4 s = texture2DRect(diffuseRect, tc); + +	float wg = 0.25; + +	// de-weight dull areas to make highlights 'pop' +	wg += s.r+s.g+s.b; + +	diff += wg*s; +		 +	w += wg; +} +  void main()   {  	vec2 tc = vary_fragcoord.xy; @@ -66,12 +80,30 @@ void main()  	{   		float w = 1.0; -		float sc = diff.a*max_cof; -				 +		float sc = (diff.a*2.0-1.0)*max_cof; +			  		float PI = 3.14159265358979323846264;  		// sample quite uniformly spaced points within a circle, for a circular 'bokeh'		 +		if (sc > 0.5) +		{ +			while (sc > 0.5) +			{ +				int its = int(max(1.0,(sc*3.7))); +				for (int i=0; i<its; ++i) +				{ +					float ang = sc+i*2*PI/its; // sc is added for rotary perturbance +					float samp_x = sc*sin(ang); +					float samp_y = sc*cos(ang); +					// you could test sample coords against an interesting non-circular aperture shape here, if desired. +					dofSampleNear(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y)); +				} +				sc -= 1.0; +			} +		} +		else if (sc < -0.5)  		{ +			sc = abs(sc);  			while (sc > 0.5)  			{  				int its = int(max(1.0,(sc*3.7))); @@ -86,7 +118,7 @@ void main()  				sc -= 1.0;  			}  		} -		 +  		diff /= w;  	} | 
