[quake3-commits] r2378 - in trunk/code/rend2: . glsl

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Dec 10 17:35:57 EST 2012


Author: smiletheory
Date: 2012-12-10 17:35:57 -0500 (Mon, 10 Dec 2012)
New Revision: 2378

Modified:
   trunk/code/rend2/glsl/lightall_fp.glsl
   trunk/code/rend2/tr_light.c
Log:
Split light sample into direct and ambient parts when using deluxemaps or per-vertex light vectors.  Fixes #5813.

Modified: trunk/code/rend2/glsl/lightall_fp.glsl
===================================================================
--- trunk/code/rend2/glsl/lightall_fp.glsl	2012-12-09 01:05:25 UTC (rev 2377)
+++ trunk/code/rend2/glsl/lightall_fp.glsl	2012-12-10 22:35:57 UTC (rev 2378)
@@ -300,28 +300,54 @@
 #elif defined(USE_LIGHT)
 	worldLight = normalize(worldLight);
 
+	float surfNL = clamp(dot(surfNormal,  worldLight),   0.0, 1.0);
+
   #if defined(USE_LIGHTMAP) || defined(USE_LIGHT_VERTEX)
-	#if defined(r_normalAmbient)
-	vec3 ambientLight = directedLight * r_normalAmbient;
-	directedLight -= ambientLight;
+    #if defined(USE_STANDARD_DELUXEMAP)
+	// Standard deluxe mapping treats the light sample as fully directed
+	// and doesn't compensate for light angle attenuation.
+	vec3 ambientLight = vec3(0.0);
     #else
-	vec3 ambientLight = vec3(0.0);
+	// Separate the light sample into directed and ambient parts.
+	//
+	// ambientMax  - if the cosine of the angle between the surface
+	//               normal and the light is below this value, the light
+	//               is fully ambient.
+	// directedMax - if the cosine of the angle between the surface
+	//               normal and the light is above this value, the light
+	//               is fully directed.
+	const float ambientMax  = 0.25;
+	const float directedMax = 0.5;
+
+	float directedScale = clamp((surfNL - ambientMax) / (directedMax - ambientMax), 0.0, 1.0);
+	
+	// Scale the directed portion to compensate for the baked-in
+	// light angle attenuation.
+	directedScale /= max(surfNL, ambientMax);
+	
+      #if defined(r_normalAmbient)
+	directedScale *= 1.0 - r_normalAmbient;
+      #endif
+
+	// Recover any unused light as ambient
+	vec3 ambientLight = directedLight;
+	directedLight *= directedScale;
+	ambientLight -= directedLight * surfNL;
     #endif
-	directedLight /= max(dot(surfNormal, worldLight), 0.004);
   #endif
-
+	
 	float NL = clamp(dot(worldNormal,  worldLight),   0.0, 1.0);
-	float surfNL = clamp(dot(surfNormal,  worldLight),   0.0, 1.0);
-	NL = min(NL, surfNL * 2.0);
 	float NE = clamp(dot(worldNormal,  SampleToView), 0.0, 1.0);
-	
+
 	float fzero = u_MaterialInfo.x;
 	float shininess = u_MaterialInfo.y;
+
   #if defined(USE_SPECULARMAP)
 	vec4 specular = texture2D(u_SpecularMap, tex);
 	//specular.rgb = clamp(specular.rgb - diffuse.rgb, 0.0, 1.0);
 	shininess *= specular.a;
   #endif
+
 	float directedDiff = NL * CalcDiffuse(worldNormal, worldLight, SampleToView, NE, NL, fzero, shininess);
 	diffuse.rgb *= directedLight * directedDiff + ambientDiff * ambientLight;
   

Modified: trunk/code/rend2/tr_light.c
===================================================================
--- trunk/code/rend2/tr_light.c	2012-12-09 01:05:25 UTC (rev 2377)
+++ trunk/code/rend2/tr_light.c	2012-12-10 22:35:57 UTC (rev 2378)
@@ -441,15 +441,7 @@
 	Com_Memset(&ent, 0, sizeof(ent));
 	VectorCopy( point, ent.e.origin );
 	R_SetupEntityLightingGrid( &ent, world );
+	VectorCopy(ent.lightDir, lightDir);
 
-	if ((DotProduct(ent.lightDir, ent.lightDir) < 0.9f) || (DotProduct(ent.lightDir, normal) < 0.1f))
-	{
-		VectorCopy(normal, lightDir);
-	}
-	else
-	{
-		VectorCopy(ent.lightDir, lightDir);
-	}
-
 	return qtrue;
 }
\ No newline at end of file



More information about the quake3-commits mailing list