From: eihrul <eihrul@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Sun, 7 Feb 2010 06:56:16 +0000 (+0000)
Subject: apply bias to orthographic shadowmaps
X-Git-Tag: xonotic-v0.1.0preview~230^2~527
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=ec8427da2f71c8b460725cde143e460b80a91e0f;p=xonotic%2Fdarkplaces.git

apply bias to orthographic shadowmaps


git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9942 d7cf8633-e32d-0410-b094-e92efae38249
---

diff --git a/gl_rmain.c b/gl_rmain.c
index 633ef695..fc314d1e 100644
--- a/gl_rmain.c
+++ b/gl_rmain.c
@@ -1058,7 +1058,7 @@ static const char *builtinshaderstring =
 "\n"
 "#if defined(USESHADOWMAPRECT) || defined(USESHADOWMAP2D)\n"
 "# ifdef USESHADOWMAPORTHO\n"
-"#  define GetShadowMapTC2D(dir) (min(dir, vec3(ShadowMap_Parameters.zw, 1.0)))\n"
+"#  define GetShadowMapTC2D(dir) (min(dir, ShadowMap_Parameters.xyz))\n"
 "# else\n"
 "#  ifdef USESHADOWMAPVSDCT\n"
 "vec3 GetShadowMapTC2D(vec3 dir)\n"
@@ -1167,7 +1167,7 @@ static const char *builtinshaderstring =
 "\n"
 "#  endif\n"
 "#  ifdef USESHADOWMAPORTHO\n"
-"	return mix(ShadowMap_Parameters.x, ShadowMap_Parameters.y, f);\n"
+"	return mix(ShadowMap_Parameters.w, 1.0, f);\n"
 "#  else\n"
 "	return f;\n"
 "#  endif\n"
@@ -1234,7 +1234,7 @@ static const char *builtinshaderstring =
 "#    endif\n"
 "#  endif\n"
 "#  ifdef USESHADOWMAPORTHO\n"
-"	return mix(ShadowMap_Parameters.x, ShadowMap_Parameters.y, f);\n"
+"	return mix(ShadowMap_Parameters.w, 1.0, f);\n"
 "#  else\n"
 "	return f;\n"
 "#  endif\n"
@@ -2216,7 +2216,7 @@ const char *builtincgshaderstring =
 "#if defined(MODE_LIGHTSOURCE) || defined(MODE_DEFERREDLIGHTSOURCE) || defined(USESHADOWMAPORTHO)\n"
 "#if defined(USESHADOWMAPRECT) || defined(USESHADOWMAP2D)\n"
 "# ifdef USESHADOWMAPORTHO\n"
-"#  define GetShadowMapTC2D(dir, ShadowMap_Parameters) (min(dir, float3(ShadowMap_Parameters.zw, 1.0)))\n"
+"#  define GetShadowMapTC2D(dir, ShadowMap_Parameters) (min(dir, ShadowMap_Parameters.xyz))\n"
 "# else\n"
 "#  ifdef USESHADOWMAPVSDCT\n"
 "float3 GetShadowMapTC2D(float3 dir, float4 ShadowMap_Parameters, samplerCUBE Texture_CubeProjection)\n"
@@ -2333,7 +2333,7 @@ const char *builtincgshaderstring =
 "\n"
 "#  endif\n"
 "#  ifdef USESHADOWMAPORTHO\n"
-"	return lerp(ShadowMap_Parameters.x, ShadowMap_Parameters.y, f);\n"
+"	return lerp(ShadowMap_Parameters.w, 1.0, f);\n"
 "#  else\n"
 "	return f;\n"
 "#  endif\n"
@@ -2404,7 +2404,7 @@ const char *builtincgshaderstring =
 "#    endif\n"
 "#  endif\n"
 "#  ifdef USESHADOWMAPORTHO\n"
-"	return lerp(ShadowMap_Parameters.x, ShadowMap_Parameters.y, f);\n"
+"	return lerp(ShadowMap_Parameters.w, 1.0, f);\n"
 "#  else\n"
 "	return f;\n"
 "#  endif\n"
diff --git a/r_shadow.c b/r_shadow.c
index 5e817fbe..1a426936 100644
--- a/r_shadow.c
+++ b/r_shadow.c
@@ -4234,6 +4234,7 @@ void R_Shadow_PrepareModelShadows(void)
 	size = 2*r_shadow_shadowmapmaxsize;
 	scale = r_shadow_shadowmapping_precision.value;
 	radius = 0.5f * size / scale;
+
 	Math_atov(r_shadows_throwdirection.string, shadowdir);
 	VectorNormalize(shadowdir);
 	dot1 = DotProduct(r_refdef.view.forward, shadowdir);
@@ -4274,7 +4275,7 @@ void R_Shadow_PrepareModelShadows(void)
 void R_DrawModelShadowMaps(void)
 {
 	int i;
-	float relativethrowdistance, scale, size, radius, nearclip, farclip, dot1, dot2;
+	float relativethrowdistance, scale, size, radius, nearclip, farclip, bias, dot1, dot2;
 	entity_render_t *ent;
 	vec3_t relativelightorigin;
 	vec3_t relativelightdirection, relativeforward, relativeright;
@@ -4325,16 +4326,17 @@ void R_DrawModelShadowMaps(void)
 	}
 
 	size = 2*r_shadow_shadowmapmaxsize;
-
-	r_shadow_shadowmap_parameters[0] = bound(0.0f, 1.0f - r_shadows_darken.value, 1.0f);
-	r_shadow_shadowmap_parameters[1] = 1.0f;
-	r_shadow_shadowmap_parameters[2] = size;
-	r_shadow_shadowmap_parameters[3] = size;
-
 	scale = r_shadow_shadowmapping_precision.value / size;
 	radius = 0.5f / scale;
 	nearclip = -r_shadows_throwdistance.value;
 	farclip = r_shadows_throwdistance.value;
+	bias = r_shadow_shadowmapping_bias.value * r_shadow_shadowmapping_nearclip.value / (2 * r_shadows_throwdistance.value) * (1024.0f / size);
+
+	r_shadow_shadowmap_parameters[0] = size;
+	r_shadow_shadowmap_parameters[1] = size;
+	r_shadow_shadowmap_parameters[2] = 1.0;
+	r_shadow_shadowmap_parameters[3] = bound(0.0f, 1.0f - r_shadows_darken.value, 1.0f);
+
 	Math_atov(r_shadows_throwdirection.string, shadowdir);
 	VectorNormalize(shadowdir);
 	Math_atov(r_shadows_focus.string, shadowfocus);
@@ -4416,7 +4418,7 @@ void R_DrawModelShadowMaps(void)
 	Matrix4x4_Concat(&mvpmatrix, &r_refdef.view.viewport.projectmatrix, &r_refdef.view.viewport.viewmatrix);
 	Matrix4x4_Invert_Full(&invmvpmatrix, &mvpmatrix);
 	Matrix4x4_CreateScale3(&scalematrix, size, -size, 1); 
-	Matrix4x4_AdjustOrigin(&scalematrix, 0, size, 0);
+	Matrix4x4_AdjustOrigin(&scalematrix, 0, size, -0.5f * bias);
 	Matrix4x4_Concat(&texmatrix, &scalematrix, &shadowmatrix);
 	Matrix4x4_Concat(&r_shadow_shadowmapmatrix, &texmatrix, &invmvpmatrix);