diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-05-24 12:24:24 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-05-24 12:24:24 -0500 | 
| commit | 0a8cdd4ee4bd80f28bfe62252d286f5f9adee2b6 (patch) | |
| tree | becd75ce1b5bcc326d60083c052c8e7f43eb5df0 /indra | |
| parent | efda0814cbae7917fde634c5e245c81915b17a9c (diff) | |
MAINT-616 Fix for broken projectors.
Diffstat (limited to 'indra')
3 files changed, 169 insertions, 58 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 7ed8ed3370..cca63872de 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -24,18 +24,21 @@   */ -#extension GL_ARB_texture_rectangle : enable -  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color;  #else  #define frag_color gl_FragColor  #endif +//class 1 -- no shadows + +#extension GL_ARB_texture_rectangle : enable +  uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect;  uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap; +uniform samplerCube environmentMap;  uniform sampler2D noiseMap;  uniform sampler2D projectionMap; @@ -46,6 +49,7 @@ uniform vec3 proj_n;  uniform float proj_focus; //distance from plane to begin blurring  uniform float proj_lod;  //(number of mips in proj map)  uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod;  uniform float proj_ambiance;  uniform float near_clip;  uniform float far_clip; @@ -53,19 +57,66 @@ uniform float far_clip;  uniform vec3 proj_origin; //origin of projection to be used for angular attenuation  uniform float sun_wash; -uniform vec3 center;  uniform vec3 color;  uniform float falloff;  uniform float size;  VARYING vec4 vary_fragcoord; +VARYING vec3 trans_center; +  uniform vec2 screen_res;  uniform mat4 inv_proj; +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	vec2 dist = tc-vec2(0.5); +	 +	float det = max(1.0-lod/(proj_lod*0.5), 0.0); +	 +	float d = dot(dist,dist); +		 +	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); +	 +	return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); +	 +	float det = min(lod/(proj_lod*0.5), 1.0); +	 +	float d = min(dist.x, dist.y); +	 +	float edge = 0.25*det; +		 +	ret *= clamp(d/edge, 0.0, 1.0); +	 +	return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	vec2 dist = tc-vec2(0.5); +	 +	float d = dot(dist,dist); +		 +	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); +	 +	return ret; +} + +  vec4 getPosition(vec2 pos_screen)  { -	float depth = texture2DRect(depthMap, pos_screen.xy).a; +	float depth = texture2DRect(depthMap, pos_screen.xy).r;  	vec2 sc = pos_screen.xy*2.0;  	sc /= screen_res;  	sc -= vec2(1.0,1.0); @@ -84,16 +135,16 @@ void main()  	frag.xy *= screen_res;  	vec3 pos = getPosition(frag.xy).xyz; -	vec3 lv = center.xyz-pos.xyz; +	vec3 lv = trans_center.xyz-pos.xyz;  	float dist2 = dot(lv,lv);  	dist2 /= size;  	if (dist2 > 1.0)  	{  		discard;  	} -	 +		  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; -	norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm +	norm = vec3((norm.xy-0.5)*2.0, norm.z);  	norm = normalize(norm);  	float l_dist = -dot(lv, proj_n); @@ -107,7 +158,11 @@ void main()  	proj_tc.xyz /= proj_tc.w;  	float fa = falloff+1.0; -	float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); +	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); +	if (dist_atten <= 0.0) +	{ +		discard; +	}  	lv = proj_origin-pos.xyz;  	lv = normalize(lv); @@ -125,32 +180,32 @@ void main()  		proj_tc.y > 0.0)  	{  		float lit = 0.0; +		float amb_da = proj_ambiance; +		  		if (da > 0.0)  		{  			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);  			float lod = diff * proj_lod; -			vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod); +			vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);  			vec3 lcol = color.rgb * plcol.rgb * plcol.a;  			lit = da * dist_atten * noise;  			col = lcol*lit*diff_tex; +			amb_da += (da*0.5)*proj_ambiance;  		} -		float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); -		float lod = diff * proj_lod; -		vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod); -		//float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0)); -		float amb_da = proj_ambiance; -		 +		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); +		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); +							  		amb_da += (da*da*0.5+0.5)*proj_ambiance; -			 +				  		amb_da *= dist_atten * noise; -		 +			  		amb_da = min(amb_da, 1.0-lit); -		 +			  		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;  	} @@ -168,18 +223,22 @@ void main()  		{  			vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; -			vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz; +			vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));  			if (stc.z > 0.0)  			{ -				stc.xy /= stc.z+proj_near; -					 +				stc.xy /= stc.w; + +				float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); +				 +				stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); +								  				if (stc.x < 1.0 &&  					stc.y < 1.0 &&  					stc.x > 0.0 &&  					stc.y > 0.0)  				{ -					vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); +					vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);  					col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;  				}  			} diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 99a277fbfc..ab077d9e02 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -31,8 +31,6 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif -VARYING vec4 vertex_color; -  uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect;  uniform sampler2DRect depthMap; @@ -49,6 +47,7 @@ uniform vec3 proj_n;  uniform float proj_focus; //distance from plane to begin blurring  uniform float proj_lod;  //(number of mips in proj map)  uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod;  uniform float proj_ambiance;  uniform float near_clip;  uniform float far_clip; @@ -58,16 +57,65 @@ uniform float sun_wash;  uniform int proj_shadow_idx;  uniform float shadow_fade; -VARYING vec4 vary_light; +uniform float size; +uniform vec3 color; +uniform float falloff; +VARYING vec3 trans_center;  VARYING vec4 vary_fragcoord;  uniform vec2 screen_res;  uniform mat4 inv_proj; +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	vec2 dist = tc-vec2(0.5); +	 +	float det = max(1.0-lod/(proj_lod*0.5), 0.0); +	 +	float d = dot(dist,dist); +		 +	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); +	 +	return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); +	 +	float det = min(lod/(proj_lod*0.5), 1.0); +	 +	float d = min(dist.x, dist.y); +	 +	float edge = 0.25*det; +		 +	ret *= clamp(d/edge, 0.0, 1.0); +	 +	return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	 +	vec2 dist = tc-vec2(0.5); +	 +	float d = dot(dist,dist); +		 +	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); +	 +	return ret; +} + +  vec4 getPosition(vec2 pos_screen)  { -	float depth = texture2DRect(depthMap, pos_screen.xy).a; +	float depth = texture2DRect(depthMap, pos_screen.xy).r;  	vec2 sc = pos_screen.xy*2.0;  	sc /= screen_res;  	sc -= vec2(1.0,1.0); @@ -85,6 +133,15 @@ void main()  	frag.xyz = frag.xyz*0.5+0.5;  	frag.xy *= screen_res; +	vec3 pos = getPosition(frag.xy).xyz; +	vec3 lv = trans_center.xyz-pos.xyz; +	float dist2 = dot(lv,lv); +	dist2 /= size; +	if (dist2 > 1.0) +	{ +		discard; +	} +	  	float shadow = 1.0;  	if (proj_shadow_idx >= 0) @@ -96,15 +153,6 @@ void main()  		shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0);  	} -	vec3 pos = getPosition(frag.xy).xyz; -	vec3 lv = vary_light.xyz-pos.xyz; -	float dist2 = dot(lv,lv); -	dist2 /= vary_light.w; -	if (dist2 > 1.0) -	{ -		discard; -	} -	  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz;  	norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm @@ -119,8 +167,12 @@ void main()  	proj_tc.xyz /= proj_tc.w; -	float fa = vertex_color.a+1.0; -	float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); +	float fa = falloff+1.0; +	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); +	if (dist_atten <= 0.0) +	{ +		discard; +	}  	lv = proj_origin-pos.xyz;  	lv = normalize(lv); @@ -138,37 +190,33 @@ void main()  		proj_tc.y > 0.0)  	{  		float lit = 0.0; +		float amb_da = proj_ambiance; +		  		if (da > 0.0)  		{  			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);  			float lod = diff * proj_lod; -			vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod); +			vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); -			vec3 lcol = vertex_color.rgb * plcol.rgb * plcol.a; +			vec3 lcol = color.rgb * plcol.rgb * plcol.a;  			lit = da * dist_atten * noise;  			col = lcol*lit*diff_tex*shadow; -		} -		 -		float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); -		float lod = diff * proj_lod; -		vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod); -		//float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0)); -		float amb_da = proj_ambiance; -		if (da > 0.0) -		{  			amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;  		} +		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); +		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); +							  		amb_da += (da*da*0.5+0.5)*proj_ambiance; -			 +				  		amb_da *= dist_atten * noise; -		 +			  		amb_da = min(amb_da, 1.0-lit); -		 -		col += amb_da*vertex_color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; +			 +		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;  	} @@ -185,19 +233,23 @@ void main()  		{  			vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; -			vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz; +			vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));  			if (stc.z > 0.0)  			{ -				stc.xy /= stc.z+proj_near; -					 +				stc.xy /= stc.w; + +				float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); +				 +				stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); +								  				if (stc.x < 1.0 &&  					stc.y < 1.0 &&  					stc.x > 0.0 &&  					stc.y > 0.0)  				{ -					vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); -					col += dist_atten*scol.rgb*vertex_color.rgb*scol.a*spec.rgb*shadow; +					vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); +					col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow;  				}  			}  		} diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index ca4e1c4b62..220677b227 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1263,7 +1263,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader";  		gDeferredSpotLightProgram.mShaderFiles.clear();  		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); -		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredSpotLightProgram.createShader(NULL, NULL);  	} | 
