From d22e865ffeff5a8983c6fa041dfa83d81720d570 Mon Sep 17 00:00:00 2001 From: eihrul Date: Wed, 30 Sep 2009 11:39:12 +0000 Subject: [PATCH] ALU cubemap indirection fixes git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9262 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 73 ++++++++++++++++-------------------------------------- r_shadow.c | 4 +-- 2 files changed, 23 insertions(+), 54 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index 997b8842..883026f4 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -910,6 +910,11 @@ static const char *builtinshaderstring = "{\n" " vec3 adir = abs(dir);\n" "# if 0\n" +"# ifdef USESHADOWMAPRECT\n" +"# define cubedir(dx, dy, ox, oy) { tc = vec2(dx, dy); offset = vec2(ox, oy); }\n" +"# else\n" +"# define cubedir(dx, dy, ox, oy) { tc = vec2(dx, dy); offset = vec2(ox/2.0, oy/4.0); }\n" +"# endif\n" " vec2 tc;\n" " vec2 offset;\n" " float ma;\n" @@ -918,73 +923,37 @@ static const char *builtinshaderstring = " if (adir.x > adir.z)\n" " {\n" " ma = adir.x;\n" -" if (dir.x >= 0.0)\n" -" {\n" -" // +X\n" -" tc = vec2(-dir.z, -dir.y);\n" -" offset = vec2(0.5, 0.5);\n" -" }\n" -" else\n" -" {\n" -" // -X\n" -" tc = vec2( dir.z, -dir.y);\n" -" offset = vec2(1.5, 0.5);\n" -" }\n" +" if (dir.x >= 0.0) cubedir(-dir.z, -dir.y, 0.5, 0.5) // +X\n" +" else cubedir( dir.z, -dir.y, 1.5, 0.5) // -X\n" " }\n" " else\n" " {\n" -" ma = adir.z;\n" -" if (dir.z >= 0.0)\n" -" {\n" -" // +Z\n" -" tc = vec2( dir.x, -dir.y);\n" -" offset = vec2(0.5, 2.5);\n" -" }\n" -" else\n" -" {\n" -" // -Z\n" -" tc = vec2(-dir.x, -dir.y);\n" -" offset = vec2(1.5, 2.5);\n" -" }\n" +" ma = adir.z;\n" +" if (dir.z >= 0.0) cubedir( dir.x, -dir.y, 0.5, 2.5) // +Z\n" +" else cubedir(-dir.x, -dir.y, 1.5, 2.5) // -Z\n" " }\n" " }\n" " else\n" " {\n" " if (adir.y > adir.z)\n" " {\n" -" ma = adir.y;\n" -" if (dir.y >= 0.0)\n" -" {\n" -" // +Y\n" -" tc = vec2( dir.x, dir.z);\n" -" offset = vec2(0.5, 1.5);\n" -" }\n" -" else\n" -" {\n" -" // -Y\n" -" tc = vec2( dir.x, -dir.z);\n" -" offset = vec2(1.5, 1.5);\n" -" }\n" +" ma = adir.y;\n" +" if (dir.y >= 0.0) cubedir( dir.x, dir.z, 0.5, 1.5) // +Y\n" +" else cubedir( dir.x, -dir.z, 1.5, 1.5) // -Y\n" " }\n" " else\n" " {\n" -" ma = adir.z;\n" -" if (dir.z >= 0.0)\n" -" {\n" -" // +Z\n" -" tc = vec2(dir.x, -dir.y);\n" -" offset = vec2(0.5, 2.5);\n" -" }\n" -" else\n" -" {\n" -" // -Z\n" -" tc = vec2(-dir.x, -dir.y);\n" -" offset = vec2(1.5, 2.5);\n" -" }\n" +" ma = adir.z;\n" +" if (dir.z >= 0.0) cubedir( dir.x, -dir.y, 0.5, 2.5) // +Z\n" +" else cubedir(-dir.x, -dir.y, 1.5, 2.5) // -Z\n" " }\n" " }\n" "\n" +"# ifdef USESHADOWMAPRECT\n" " return vec3(tc * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma + vec3(offset * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" +"# else\n" +" return vec3(tc * ShadowMap_Parameters.xy, ShadowMap_Parameters.w) / ma + vec3(offset, ShadowMap_Parameters.z);\n" +"# endif\n" "# else\n" "# ifdef USESHADOWMAPRECT \n" " return vec3(textureCube(Texture_CubeProjection, dir.xyz).ra * ShadowMap_TextureScale.xy, ShadowMap_Parameters.z + ShadowMap_Parameters.w / max(max(adir.x, adir.y), adir.z));\n" @@ -1067,7 +1036,7 @@ static const char *builtinshaderstring = "# else\n" "# ifdef USESHADOWMAPPCF\n" "# if defined(HASTEXTUREGATHER) || defined(HASTEXTURE4)\n" -" vec2 center = shadowmaptc.xy*ShadowMap_Texture_Scale.zw, offset = fract(center - 0.5);\n" +" vec2 center = shadowmaptc.xy*ShadowMap_TextureScale.zw, offset = fract(center - 0.5);\n" " vec4 group1 = step(shadowmaptc.z, textureGather(Texture_ShadowMap2D, (center + vec2(-1.0, -1.0))*ShadowMap_TextureScale.xy)),\n" " group2 = step(shadowmaptc.z, textureGather(Texture_ShadowMap2D, (center + vec2( 1.0, -1.0))*ShadowMap_TextureScale.xy)),\n" " group3 = step(shadowmaptc.z, textureGather(Texture_ShadowMap2D, (center + vec2(-1.0, 1.0))*ShadowMap_TextureScale.xy)),\n" diff --git a/r_shadow.c b/r_shadow.c index 2f17a212..831c61b2 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -1522,8 +1522,8 @@ void R_Shadow_RenderMode_ShadowMap(int side, qboolean clear, int size) R_Viewport_InitRectSideView(&viewport, &rsurface.rtlight->matrix_lighttoworld, side, size, r_shadow_shadowmapping_bordersize.integer, nearclip, farclip, NULL); r_shadow_shadowmap_texturescale[0] = 1.0f / R_TextureWidth(r_shadow_shadowmap2dtexture); r_shadow_shadowmap_texturescale[1] = 1.0f / R_TextureHeight(r_shadow_shadowmap2dtexture); - r_shadow_shadowmap_parameters[0] = (0.5f / 4) * (1.0f - r_shadow_shadowmapborder) / size; - r_shadow_shadowmap_parameters[1] = 1.0f / (3 * 4); + r_shadow_shadowmap_parameters[0] = (0.5f / 2) * (1.0f - r_shadow_shadowmapborder / (float)size); + r_shadow_shadowmap_parameters[1] = (0.5f / 4) * (1.0f - r_shadow_shadowmapborder / (float)size); r_shadow_rendermode = R_SHADOW_RENDERMODE_SHADOWMAP2D; } else if (r_shadow_shadowmode == 2) -- 2.39.2