diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class3/deferred')
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl | 69 | 
1 files changed, 61 insertions, 8 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 96a083b522..9f94b9e8ea 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -56,9 +56,8 @@ vec3 vary_AdditiveColor;  vec3 vary_AtmosAttenuation;  uniform float gi_ambiance; -vec4 getPosition(vec2 pos_screen) -{ //get position in screen space (world units) given window coordinate and depth map -	float depth = texture2DRect(depthMap, pos_screen.xy).a; +vec4 getPosition_d(vec2 pos_screen, float depth) +{  	vec2 sc = pos_screen.xy*2.0;  	sc /= screen_res;  	sc -= vec2(1.0,1.0); @@ -69,6 +68,12 @@ vec4 getPosition(vec2 pos_screen)  	return pos;  } +vec4 getPosition(vec2 pos_screen) +{ //get position in screen space (world units) given window coordinate and depth map +	float depth = texture2DRect(depthMap, pos_screen.xy).a; +	return getPosition_d(pos_screen, depth); +} +  vec3 getPositionEye()  {  	return vary_PositionEye; @@ -252,7 +257,8 @@ vec3 scaleSoftClip(vec3 light)  void main()   {  	vec2 tc = vary_fragcoord.xy; -	vec3 pos = getPosition(tc).xyz; +	float depth = texture2DRect(depthMap, tc.xy).a; +	vec3 pos = getPosition_d(tc, depth).xyz;  	vec3 norm = texture2DRect(normalMap, tc).xyz*2.0-1.0;  	//vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz; @@ -274,11 +280,58 @@ void main()  	col *= diffuse.rgb; -	if (spec.a > 0.0) +	if (spec.a > 0.0) // specular reflection  	{ -		vec3 ref = normalize(reflect(pos.xyz, norm.xyz)); -		float sa = dot(ref, vary_light.xyz); -		col.rgb += vary_SunlitColor*scol*spec.rgb*texture2D(lightFunc, vec2(sa, spec.a)).a; +		// the old infinite-sky shiny reflection +		// +		vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +		float sa = dot(refnormpersp, vary_light.xyz); +		vec3 dumbshiny = vary_SunlitColor*scol*texture2D(lightFunc, vec2(sa, spec.a)).a; + +		// screen-space cheap fakey reflection map +		// +		vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz)); +		depth -= 0.5; // unbias depth +		// first figure out where we'll make our 2D guess from +		vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth; +		// Offset the guess source a little according to a trivial +		// checkerboard dither function and spec.a. +		// This is meant to be similar to sampling a blurred version +		// of the diffuse map.  LOD would be better in that regard. +		// The goal of the blur is to soften reflections in surfaces +		// with low shinyness, and also to disguise our lameness. +		float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0 +		float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5); + +		ref2d += vec2(checkoffset, checkoffset); +		ref2d += tc.xy; // use as offset from destination +		// Get attributes from the 2D guess point. +		// We average two samples of diffuse (not of anything else) per +		// pixel to try to reduce aliasing some more. +		vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb + +				     texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb); +		float refdepth = texture2DRect(depthMap, ref2d).a; +		vec3 refpos = getPosition_d(ref2d, refdepth).xyz; +		float refshad = texture2DRect(lightMap, ref2d).r; +		vec3 refn = normalize(texture2DRect(normalMap, ref2d).rgb * 2.0 - 1.0); +		// figure out how appropriate our guess actually was +		float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos))); +		// darken reflections from points which face away from the reflected ray - our guess was a back-face +		//refapprop *= step(dot(refnorm, refn), 0.0); +		refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant +		// get appropriate light strength for guess-point. +		// reflect light direction to increase the illusion that +		// these are reflections. +		vec3 reflight = reflect(lightnorm.xyz, norm.xyz); +		float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad); +		// apply sun color to guess-point, dampen according to inappropriateness of guess +		float refmod = min(refapprop, reflit); +		vec3 refprod = vary_SunlitColor * refcol.rgb * refmod; +		vec3 ssshiny = (refprod * spec.a); +		ssshiny *= 0.3; // dampen it even more + +		// add the two types of shiny together +		col += (ssshiny + dumbshiny) * spec.rgb;  	}  	col = atmosLighting(col); | 
