From b205255e1b80349f082e66546ddbfd6ee9b3cc2a Mon Sep 17 00:00:00 2001 From: eihrul Date: Sat, 8 Dec 2012 02:31:28 +0000 Subject: [PATCH] additional high quality shadowmap filter that uses the shadow sampler rather than texture gathers git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11858 d7cf8633-e32d-0410-b094-e92efae38249 --- r_shadow.c | 3 +-- shader_glsl.h | 14 ++++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/r_shadow.c b/r_shadow.c index 65eb096b..02f8b073 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -477,13 +477,12 @@ static void R_Shadow_SetShadowMode(void) } else { + r_shadow_shadowmapsampler = vid.support.arb_shadow && r_shadow_shadowmapshadowsampler; switch (r_shadow_shadowmapfilterquality) { case 1: - r_shadow_shadowmapsampler = vid.support.arb_shadow && r_shadow_shadowmapshadowsampler; break; case 2: - r_shadow_shadowmapsampler = vid.support.arb_shadow && r_shadow_shadowmapshadowsampler; r_shadow_shadowmappcf = 1; break; case 3: diff --git a/shader_glsl.h b/shader_glsl.h index dcb9c705..ebfa9b47 100644 --- a/shader_glsl.h +++ b/shader_glsl.h @@ -885,11 +885,17 @@ "# ifdef USESHADOWMAPPCF\n" "# define texval(off) dp_shadow2D(Texture_ShadowMap2D, vec3(off, shadowmaptc.z)) \n" " vec2 offset = fract(shadowmaptc.xy - 0.5);\n" -" vec4 size = vec4(offset + 1.0, 2.0 - offset), weight = (vec4(1.0, 1.0, -0.5, -0.5) + (shadowmaptc.xy - 0.5*offset).xyxy)*ShadowMap_TextureScale.xyxy;\n" +" vec4 size = vec4(offset + 1.0, 2.0 - offset);\n" +"# if USESHADOWMAPPCF > 1\n" +" vec2 center = (shadowmaptc.xy - offset + 0.5)*ShadowMap_TextureScale;\n" +" vec4 weight = (vec4(-1.5, -1.5, 2.0, 2.0) + (shadowmaptc.xy - 0.5*offset).xyxy)*ShadowMap_TextureScale.xyxy;\n" +" f = (1.0/25.0)*dot(size.zxzx*size.wwyy, vec4(texval(weight.xy), texval(weight.zy), texval(weight.xw), texval(weight.zw))) +\n" +" (2.0/25.0)*dot(size, vec4(texval(vec2(weight.z, center.y)), texval(vec2(center.x, weight.w)), texval(vec2(weight.x, center.y)), texval(vec2(center.x, weight.y)))) +\n" +" (4.0/25.0)*texval(center);\n" +"# else\n" +" vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (shadowmaptc.xy - 0.5*offset).xyxy)*ShadowMap_TextureScale.xyxy;\n" " f = (1.0/9.0)*dot(size.zxzx*size.wwyy, vec4(texval(weight.zw), texval(weight.xw), texval(weight.zy), texval(weight.xy)));\n" -"//# define texval(x, y) dp_shadow2D(Texture_ShadowMap2D, vec3(center + vec2(x, y)*ShadowMap_TextureScale, shadowmaptc.z)) \n" -"// vec2 center = shadowmaptc.xy*ShadowMap_TextureScale;\n" -"// f = dot(vec4(0.25), vec4(texval(-0.4, 1.0), texval(-1.0, -0.4), texval(0.4, -1.0), texval(1.0, 0.4)));\n" +"# endif\n" "# else\n" " f = dp_shadow2D(Texture_ShadowMap2D, vec3(shadowmaptc.xy*ShadowMap_TextureScale, shadowmaptc.z));\n" "# endif\n" -- 2.39.2