diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-01-24 12:59:18 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-01-24 12:59:18 -0600 | 
| commit | e02f007d2013e089c07f3abefe2d87d85cbcc834 (patch) | |
| tree | e5d1342952d33265ce12ebeea4fb4bed8a0c1377 | |
| parent | 18e7f1bffd875bb933212367f0d62dfc4da871b9 (diff) | |
SH-1427 Fix for spot lights not working properly on alpha objects, and fix for alpha lighting of point lights not matching deferred lights.
8 files changed, 30 insertions, 29 deletions
| diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index cd827f5091..f26764cc42 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -997,7 +997,7 @@ void LLLightState::setSpotDirection(const LLVector3& direction)  		const glh::matrix4f& mat = gGL.getModelviewMatrix();  		mat.mult_matrix_dir(dir); -		mSpotDirection.set(direction); +		mSpotDirection.set(dir.v);  	}  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index 0170ad4b55..40b0cf47ac 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -61,17 +61,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -79,7 +79,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 93b1a114db..8c96d55342 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -70,17 +70,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -88,7 +88,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 @@ -123,7 +123,6 @@ void main()  	col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);  	vary_pointlight_col = col.rgb*diffuse_color.rgb; -  	col.rgb = vec3(0,0,0);  	// Add windlight lights diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl index d7b90978ba..c0edddc40a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl @@ -65,17 +65,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -83,7 +83,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index 5a3955ef00..83815b1786 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -63,21 +63,21 @@ uniform vec3 light_diffuse[8];  float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  { -	//get light vector +//get light vector  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -85,7 +85,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 9540ddd2e8..1660f9687e 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -69,17 +69,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -87,7 +87,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl index 9c7a332417..84c27edb26 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl @@ -66,17 +66,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -84,7 +84,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index df8f8793d1..38f9851929 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -5297,7 +5297,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			light_state->setConstantAttenuation(0.f);  			if (sRenderDeferred)  			{ -				light_state->setLinearAttenuation(light_radius*1.5f); +				F32 size = light_radius*1.5f; +				light_state->setLinearAttenuation(size*size);  				light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);  			}  			else @@ -5319,7 +5320,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  				light_state->setSpotCutoff(90.f);  				light_state->setSpotExponent(2.f); -				light_state->setSpecular(LLColor4::black); +				const LLColor4 specular(0.f, 0.f, 0.f, 0.f); +				light_state->setSpecular(specular);  			}  			else // omnidirectional (point) light  			{ | 
