Browse Source

Fixing invalid light falloff

BearishSun 8 years ago
parent
commit
9a25f1222c

+ 20 - 22
Data/Raw/Engine/Includes/LightingCommon.bslinc

@@ -18,7 +18,7 @@ Technique
 				float3 position;
 				float radius;
 				float3 direction;
-				float intensity;
+				float luminance;
 				float3 spotAngles;
 				float radiusSqrdInv;
 				float3 color;
@@ -76,23 +76,23 @@ Technique
 				return color * (1.0f / PI);
 			}
 			
-			float getSpotAttenuation(float3 worldPosToLight, float3 direction, float3 angles)
+			float getSpotAttenuation(float3 toLight, float3 direction, float3 angles)
 			{
-				float output = saturate((dot(-worldPosToLight, direction) - angles.y) * angles.z);
+				float output = saturate((dot(-toLight, direction) - angles.y) * angles.z);
 				return output * output;
 			}			
 			
 			float3 getDirLightContibution(SurfaceData surfaceData, LightData lightData)
 			{
-				return lightData.color * lightData.intensity;
+				return lightData.color * lightData.luminance;
 			}
 			
-			float3 getPointLightContribution(float3 L, float3 worldPosition, SurfaceData surfaceData, LightData lightData)
+			float3 getPointLightContribution(float3 toLight, SurfaceData surfaceData, LightData lightData)
 			{
 				float3 N = surfaceData.worldNormal.xyz;
 				
-				float distanceSqrd = dot(L, L);
-				float distanceAttenuation = 1/(distanceSqrd + 1);
+				float distanceSqrd = dot(toLight, toLight);
+				float distanceAttenuation = 1.0f / max(distanceSqrd, 0.01f*0.01f);
 				
 				float radiusAttenuation = distanceSqrd * lightData.radiusSqrdInv;
 				radiusAttenuation *= radiusAttenuation;
@@ -100,13 +100,13 @@ Technique
 				radiusAttenuation *= radiusAttenuation;
 
 				float attenuation = distanceAttenuation * radiusAttenuation;
-				return lightData.color * lightData.intensity * attenuation;
+				return lightData.color * lightData.luminance * attenuation;
 			}
 			
-			float3 getSpotLightContribution(float3 L, float3 worldPosition, SurfaceData surfaceData, LightData lightData)
+			float3 getSpotLightContribution(float3 toLight, SurfaceData surfaceData, LightData lightData)
 			{
-				float3 pointLightContribution = getPointLightContribution(L, worldPosition, surfaceData, lightData);
-				float spotFalloff = getSpotAttenuation(L, lightData.direction, lightData.spotAngles);
+				float3 pointLightContribution = getPointLightContribution(toLight, surfaceData, lightData);
+				float spotFalloff = getSpotAttenuation(toLight, lightData.direction, lightData.spotAngles);
 				
 				return pointLightContribution * spotFalloff;
 			}
@@ -165,11 +165,10 @@ Technique
                     {
                         uint lightIdx = gLightIndices[i];
                         
-						float3 L = gLights[lightIdx].position - worldPos;
-						L = normalize(L);
-						
-						float3 lightContrib = getPointLightContribution(L, worldPos, surfaceData, gLights[lightIdx]);
+						float3 toLight = gLights[lightIdx].position - worldPos;
+						float3 lightContrib = getPointLightContribution(toLight, surfaceData, gLights[lightIdx]);
 
+						float3 L = normalize(toLight);
 						float NoL = saturate(dot(N, L));
 						lightContribution += lightContrib * NoL;
                     }
@@ -178,11 +177,10 @@ Technique
                     {
                         uint lightIdx = gLightIndices[i];
 						
-						float3 L = gLights[lightIdx].position - worldPos;
-						L = normalize(L);
-						
-                        float3 lightContrib = getSpotLightContribution(L, worldPos, surfaceData, gLights[lightIdx]);
+						float3 toLight = gLights[lightIdx].position - worldPos;
+                        float3 lightContrib = getSpotLightContribution(toLight, surfaceData, gLights[lightIdx]);
 						
+						float3 L = normalize(toLight);
 						float NoL = saturate(dot(N, L));
 						lightContribution += lightContrib * NoL;
                     }
@@ -218,7 +216,7 @@ Technique
 				vec3 position;
 				float radius;
 				vec3 direction;
-				float intensity;
+				float luminance;
 				vec3 spotAngles;
 				float radiusSqrdInv;
 				vec3 color;
@@ -270,7 +268,7 @@ Technique
 				vec3 L = -lightData.direction;
 				
 				float NoL = clamp(dot(N, L), 0.0, 1.0); // TODO - Add bias here?
-				return lightData.color * lightData.intensity * NoL;
+				return lightData.color * lightData.luminance * NoL;
 			}
 			
 			vec3 getPointLightContribution(vec3 L, vec3 worldPosition, SurfaceData surfaceData, LightData lightData)
@@ -289,7 +287,7 @@ Technique
 				radiusAttenuation *= radiusAttenuation;
 				
 				float attenuation = distanceAttenuation * radiusAttenuation;
-				return lightData.color * lightData.intensity * ((NoL * attenuation));
+				return lightData.color * lightData.luminance * ((NoL * attenuation));
 			}
 			
 			vec3 getPointLightContribution(vec3 worldPosition, SurfaceData surfaceData, LightData lightData)

+ 3 - 3
Source/BansheeCore/Include/BsLight.h

@@ -105,7 +105,7 @@ namespace bs
 		void setPhysicallyBasedAttenuation(bool enabled);
 
 		/**
-		 * Gets the power of the light source. This is luminous flux for point & spot lights, and radiance for directional 
+		 * Gets the power of the light source. This is luminous flux for point & spot lights, and luminance for directional 
 		 * lights.
 		 */
 		float getIntensity() const { return mIntensity; }
@@ -139,13 +139,13 @@ namespace bs
 		Sphere getBounds() const { return mBounds; }
 
 		/**
-		 * Returns the radiance of the light source. This is the value that should be used in lighting equations.
+		 * Returns the luminance of the light source. This is the value that should be used in lighting equations.
 		 *
 		 * @note	
 		 * Ignores the light direction, therefore caller must ensure to properly handle non-uniform emitters like spot 
 		 * lights.
 		 */
-		float getRadiance() const;
+		float getLuminance() const;
 
 		/**	Checks whether the light should be rendered or not. */
 		bool getIsActive() const { return mIsActive; }

+ 3 - 3
Source/BansheeCore/Source/BsLight.cpp

@@ -55,7 +55,7 @@ namespace bs
 		_markCoreDirty(); 
 	}
 
-	float LightBase::getRadiance() const
+	float LightBase::getLuminance() const
 	{
 		switch (mType)
 		{
@@ -78,8 +78,8 @@ namespace bs
 	void LightBase::updatePhysicallyCorrectRange()
 	{
 		// When lower than this attenuation light influence is assumed to be zero
-		const float minAttenuation = 0.05f;
-		mRange = sqrt(std::max(0.0f, mIntensity / minAttenuation - 1.0f));
+		const float minAttenuation = 0.2f;
+		mRange = sqrt(std::max(0.0f, getLuminance() / minAttenuation));
 
 		updateBounds();
 	}

+ 1 - 1
Source/RenderBeast/Include/BsLightRendering.h

@@ -19,7 +19,7 @@ namespace bs { namespace ct
 		Vector3 position;
 		float radius;
 		Vector3 direction;
-		float intensity;
+		float luminance;
 		Vector3 spotAngles;
 		float radiusSqrdInv;
 		Vector3 color;

+ 1 - 1
Source/RenderBeast/Source/BsLightRendering.cpp

@@ -31,7 +31,7 @@ namespace bs { namespace ct
 		output.position = mInternal->getPosition();
 		output.radius = mInternal->getBounds().getRadius();
 		output.direction = mInternal->getRotation().zAxis();
-		output.intensity = mInternal->getIntensity();
+		output.luminance = mInternal->getLuminance();
 		output.spotAngles.x = spotAngle.valueRadians();
 		output.spotAngles.y = Math::cos(output.spotAngles.x);
 		output.spotAngles.z = 1.0f / (Math::cos(spotFalloffAngle) - output.spotAngles.y);