diff options
| author | Tofu Linden <tofu.linden@lindenlab.com> | 2010-08-24 19:22:00 +0100 | 
|---|---|---|
| committer | Tofu Linden <tofu.linden@lindenlab.com> | 2010-08-24 19:22:00 +0100 | 
| commit | e416840f85dc4a367894036b9fe483f17d959c54 (patch) | |
| tree | e12956cbe7a0082bbaaa545cb80d9e86b13f88e8 /indra/newview/app_settings/shaders/class3/deferred | |
| parent | 98cc2365034a93c69704daa69efb389799cc9627 (diff) | |
Backed out changeset c3d41f18ce2b
back-out the back-out for this branch.  yay.
Diffstat (limited to 'indra/newview/app_settings/shaders/class3/deferred')
4 files changed, 78 insertions, 15 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl index 7325825d6d..66606233cd 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl @@ -44,7 +44,8 @@ float getDepth(vec2 pos_screen)  void main()   { -	vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz*2.0-1.0; +	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);  	vec3 ccol = texture2DRect(giLightMap, vary_fragcoord.xy).rgb; @@ -56,9 +57,10 @@ void main()  	for (int i = 0; i < kern_length; i++)  	{  		vec2 tc = vary_fragcoord.xy + kern[i].y*dlt; -	    vec3 sampNorm = texture2DRect(normalMap, tc.xy).xyz*2.0-1.0; -	     -	   float d = dot(norm.xyz, sampNorm); +		vec3 sampNorm = texture2DRect(normalMap, tc.xy).xyz; +		sampNorm = vec3((sampNorm.xy-0.5)*2.0,sampNorm.z); // unpack norm +		 +		float d = dot(norm.xyz, sampNorm);  		if (d > 0.5)  		{ diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl index 939710cb56..1b8354dbd1 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl @@ -178,7 +178,8 @@ void main()  	float rad = gi_range*0.5; -	vec3 norm = texture2DRect(normalMap, pos_screen).xyz*2.0-1.0; +	vec3 norm = texture2DRect(normalMap, pos_screen).xyz; +	norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm  	float dist = max(length(pos.xyz)-rad, 0.0);  	float da = clamp(1.0-dist/rad, 0.0, 1.0); diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 96a083b522..c88edd0a60 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,8 +257,10 @@ vec3 scaleSoftClip(vec3 light)  void main()   {  	vec2 tc = vary_fragcoord.xy; -	vec3 pos = getPosition(tc).xyz; -	vec3 norm = texture2DRect(normalMap, tc).xyz*2.0-1.0; +	float depth = texture2DRect(depthMap, tc.xy).a; +	vec3 pos = getPosition_d(tc, depth).xyz; +	vec3 norm = texture2DRect(normalMap, tc).xyz; +	norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm  	//vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;  	float da = max(dot(norm.xyz, vary_light.xyz), 0.0); @@ -274,11 +281,63 @@ 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 = texture2DRect(normalMap, ref2d).rgb; +		refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm +		refn = normalize(refn); +		// 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 +		*/ +		vec3 ssshiny = vec3(0,0,0); + +		// add the two types of shiny together +		col += (ssshiny + dumbshiny) * spec.rgb;  	}  	col = atmosLighting(col); diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl index 258acee08c..5b33ea5bfe 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl @@ -14,5 +14,6 @@ void main()  	vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);  	gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, col.a <= 0.5 ? 0.0 : 0.005);  	gl_FragData[1] = vec4(0,0,0,0); -	gl_FragData[2] = vec4(normalize(vary_normal)*0.5+0.5, 0.0); +	vec3 nvn = normalize(vary_normal); +	gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);  } | 
