diff options
| author | Dave Parks <davep@lindenlab.com> | 2010-12-10 15:13:58 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2010-12-10 15:13:58 -0600 | 
| commit | ffd7779e5b1f048c9c2220496f7382c2ad1b02eb (patch) | |
| tree | c421707ffd2a1708aeb3676ed209643c7781be85 /indra/newview/app_settings/shaders/class1 | |
| parent | b9536434f7a09cb47fc2174056c85a80843edac5 (diff) | |
DoF tweaks -- reviewed by Falcon.
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl | 80 | 
1 files changed, 35 insertions, 45 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 02712e0a5b..7c89c01ea4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -17,8 +17,10 @@ uniform sampler2D bloomMap;  uniform float depth_cutoff;  uniform float norm_cutoff; -uniform float near_focal_distance; -uniform float far_focal_distance; +uniform float focal_distance; +uniform float blur_constant; +uniform float tan_pixel_angle; +uniform float magnification;  uniform mat4 inv_proj;  uniform vec2 screen_res; @@ -39,11 +41,22 @@ void dofSample(inout vec4 diff, inout float w, float fd, float x, float y)  	vec2 tc = vary_fragcoord.xy+vec2(x,y);  	float d = getDepth(tc); -	if (d < fd) +	float wg = 1.0; +	//if (d < fd) +	//{ +	//	diff += texture2DRect(diffuseRect, tc); +	//	w = 1.0; +	//} +	if (d > fd)  	{ -		diff += texture2DRect(diffuseRect, tc); -		w += 1.0; +		wg = max(d/fd, 0.1);  	} +	 +	diff += texture2DRect(diffuseRect, tc+vec2(0.5,0.5))*wg*0.25; +	diff += texture2DRect(diffuseRect, tc+vec2(-0.5,0.5))*wg*0.25; +	diff += texture2DRect(diffuseRect, tc+vec2(0.5,-0.5))*wg*0.25; +	diff += texture2DRect(diffuseRect, tc+vec2(-0.5,-0.5))*wg*0.25; +	w += wg;  }  void dofSampleNear(inout vec4 diff, inout float w, float x, float y) @@ -64,22 +77,30 @@ void main()  	float sc = 0.75; -	float depth[5]; -	depth[0] = getDepth(tc); +	float depth; +	depth = getDepth(tc);  	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); -	if (depth[0] < far_focal_distance)  	{ //pixel is behind far focal plane  		float w = 1.0; -		float fd = (depth[0]-far_focal_distance)*0.5+far_focal_distance; -		float sc = far_focal_distance - depth[0]; -		sc /= near_focal_distance-far_focal_distance; +		sc = (abs(depth-focal_distance)/-depth)*blur_constant; +		 +		sc /= magnification; +		 +		// tan_pixel_angle = pixel_length/-depth; +		float pixel_length =  tan_pixel_angle*-focal_distance; +		 +		sc = sc/pixel_length; +		 +		//diff.r = sc; -		sc = sqrt(sc); +		sc = min(abs(sc), 8.0); -		sc = min(sc, 8.0); +		//sc = 4.0; +		 +		float fd = depth*0.5f;  		while (sc > 1.0)  		{ @@ -96,41 +117,10 @@ void main()  			dofSample(diff,w, fd, sc2,0);  			sc -= 0.5;  		} +		  		diff /= w;  	} -	else -	{ -		float fd = near_focal_distance; -		if (depth[0] > fd) -		{ //pixel is in front of near focal plane -			//diff.r = 1.0; -			float w = 1.0; -			float sc = near_focal_distance-depth[0]; -			sc /= near_focal_distance; -			sc *= 8.0; -			sc = min(sc, 8.0); -						 -			fd = depth[0]; -			while (sc > 1.0) -			{ -				dofSampleNear(diff,w, sc,sc); -				dofSampleNear(diff,w, -sc,sc); -				dofSampleNear(diff,w, sc,-sc); -				dofSampleNear(diff,w, -sc,-sc); -				 -				sc -= 0.5; -				float sc2 = sc*1.414; -				dofSampleNear(diff,w, 0,sc2); -				dofSampleNear(diff,w, 0,-sc2); -				dofSampleNear(diff,w, -sc2,0); -				dofSampleNear(diff,w, sc2,0); -				sc -= 0.5; -			} -			diff /= w; -		}	 -	} -	  	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);  	gl_FragColor = diff + bloom; | 
