diff options
Diffstat (limited to 'indra/newview/app_settings/shaders')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl | 172 | 
1 files changed, 134 insertions, 38 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 03c2e63fb1..eec44d9d42 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -17,6 +17,8 @@ uniform sampler2D bloomMap;  uniform float depth_cutoff;  uniform float norm_cutoff; +uniform float near_focal_distance; +uniform float far_focal_distance;  uniform mat4 inv_proj;  uniform vec2 screen_res; @@ -32,55 +34,149 @@ float getDepth(vec2 pos_screen)  	return p.z/p.w;  } +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) +	{ +		diff += texture2DRect(diffuseRect, tc); +		w += 1.0; +	} +} + +void dofSampleNear(inout vec4 diff, inout float w, float x, float y) +{ +	vec2 tc = vary_fragcoord.xy+vec2(x,y); +		 +	diff += texture2DRect(diffuseRect, tc); +	w += 1.0; +} +  void main()   {  	vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;  	norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm -	float depth = getDepth(vary_fragcoord.xy); +	  	vec2 tc = vary_fragcoord.xy;  	float sc = 0.75; -	vec2 de; -	de.x = (depth-getDepth(tc+vec2(sc, sc))) + (depth-getDepth(tc+vec2(-sc, -sc))); -	de.y = (depth-getDepth(tc+vec2(-sc, sc))) + (depth-getDepth(tc+vec2(sc, -sc))); -	de /= depth; -	de *= de; -	de = step(depth_cutoff, de); -	 -	vec2 ne; -	vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb; -	nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm -	ne.x = dot(nexnorm, norm); -	vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb; -	neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm -	ne.y = dot(neynorm, norm); -	 -	ne = 1.0-ne; -	 -	ne = step(norm_cutoff, ne); -	 -	float edge_weight = clamp(dot(de,de)+dot(ne,ne), 0.0, 1.0); -	//edge_weight *= 0.0; -	 -	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); +	float depth[5]; +	depth[0] = getDepth(tc); +		  	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,1))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,-1))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,1))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,-1))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,0))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,0))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,1))*edge_weight; -	diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,-1))*edge_weight; -	 -	diff /= 1.0+edge_weight*8.0; +	bool do_aa = true; -	vec4 blur = texture2DRect(edgeMap, vary_fragcoord.xy); -	 -	//gl_FragColor = vec4(edge_weight,edge_weight,edge_weight, 1.0); +	if (depth[0] < far_focal_distance) +	{ //pixel is behind far focal plane +		float w = 1.0; +		 +		float fd = far_focal_distance; +		float sc = clamp(depth[0]/fd, 0.0, -8.0/fd); +		sc = min(sc, 8.0); +		 +		//fd = depth[0]*0.5; +			 +		while (sc > 1.0) +		{ +			do_aa = false; +			dofSample(diff,w, fd, sc,sc); +			dofSample(diff,w, fd, -sc,sc); +			dofSample(diff,w, fd, sc,-sc); +			dofSample(diff,w, fd, -sc,-sc); +			 +			sc -= 0.5; +			float sc2 = sc*1.414; +			dofSample(diff,w, fd, 0,sc2); +			dofSample(diff,w, fd, 0,-sc2); +			dofSample(diff,w, fd, -sc2,0); +			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 = depth[0] - fd; +			sc = min(-sc/fd*16.0, 8.0); +						 +			fd = depth[0]; +			while (sc > 1.0) +			{ +				do_aa = false; +				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; +		}	 +		 +		if (do_aa) +		{ +			depth[1] = getDepth(tc+vec2(sc,sc)); +			depth[2] = getDepth(tc+vec2(-sc,-sc)); +			depth[3] = getDepth(tc+vec2(-sc,sc)); +			depth[4] = getDepth(tc+vec2(sc, -sc)); +				 +			 +			vec2 de; +			de.x = (depth[0]-depth[1]) + (depth[0]-depth[2]); +			de.y = (depth[0]-depth[3]) + (depth[0]-depth[4]); +			de /= depth[0]; +			de *= de; +			de = step(depth_cutoff, de); +			 +			vec2 ne; +			vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb; +			nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm +			ne.x = dot(nexnorm, norm); +			vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb; +			neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm +			ne.y = dot(neynorm, norm); +			 +			ne = 1.0-ne; +			 +			ne = step(norm_cutoff, ne); +			 +			float edge_weight = clamp(dot(de,de)+dot(ne,ne), 0.0, 1.0); +			//edge_weight *= 0.0; +			 +			//diff.r = edge_weight; +			 +			if (edge_weight > 0.0) +			{ +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,1))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,-1))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,1))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,-1))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,0))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,0))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,1))*edge_weight; +				diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,-1))*edge_weight; +				diff /= 1.0+edge_weight*8.0; +			} +		} +	} +			 +	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);  	gl_FragColor = diff + bloom; -	//gl_FragColor.r = edge_weight;  } | 
