From: eihrul Date: Sun, 7 Feb 2010 19:04:11 +0000 (+0000) Subject: attempting cheaper non-VSDCT projection X-Git-Tag: xonotic-v0.1.0preview~230^2~526 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=5c05207ec08c575bf265f78934b0d82af190375a;p=xonotic%2Fdarkplaces.git attempting cheaper non-VSDCT projection git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9943 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/gl_rmain.c b/gl_rmain.c index fc314d1e..d8c67879 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -1063,55 +1063,23 @@ static const char *builtinshaderstring = "# ifdef USESHADOWMAPVSDCT\n" "vec3 GetShadowMapTC2D(vec3 dir)\n" "{\n" -" vec3 adir = abs(dir);\n" -" vec4 proj = textureCube(Texture_CubeProjection, dir);\n" -" float ma = max(max(adir.x, adir.y), adir.z);\n" -" vec3 stc = vec3(mix(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc.xy += proj.zw * ShadowMap_Parameters.y;\n" -" stc.z += ShadowMap_Parameters.z;\n" -" return stc;\n" +" vec3 adir = abs(dir);\n" +" float ma = max(max(adir.x, adir.y), adir.z);\n" +" vec4 proj = textureCube(Texture_CubeProjection, dir);\n" +" vec3 stc = vec3(mix(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" +" stc += vec3(proj.zw * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" +" return stc;\n" "}\n" "# else\n" "vec3 GetShadowMapTC2D(vec3 dir)\n" "{\n" " vec3 adir = abs(dir);\n" -" vec2 tc;\n" -" vec2 offset;\n" -" float ma;\n" -" if (adir.x > adir.y)\n" -" {\n" -" if (adir.x > adir.z) // X\n" -" {\n" -" ma = adir.x;\n" -" tc = dir.zy;\n" -" offset = vec2(mix(0.5, 1.5, dir.x < 0.0), 0.5);\n" -" }\n" -" else // Z\n" -" {\n" -" ma = adir.z;\n" -" tc = dir.xy;\n" -" offset = vec2(mix(0.5, 1.5, dir.z < 0.0), 2.5);\n" -" }\n" -" }\n" -" else\n" -" {\n" -" if (adir.y > adir.z) // Y\n" -" {\n" -" ma = adir.y;\n" -" tc = dir.xz;\n" -" offset = vec2(mix(0.5, 1.5, dir.y < 0.0), 1.5);\n" -" }\n" -" else // Z\n" -" {\n" -" ma = adir.z;\n" -" tc = dir.xy;\n" -" offset = vec2(mix(0.5, 1.5, dir.z < 0.0), 2.5);\n" -" }\n" -" }\n" -"\n" -" vec3 stc = vec3(tc * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc.xy += offset * ShadowMap_Parameters.y;\n" -" stc.z += ShadowMap_Parameters.z;\n" +" float ma = max(max(adir.x, adir.y), adir.z);\n" +" vec4 proj = vec4(dir.zyx, 0.5), projy = vec4(dir.xzy, 1.5), projz = vec4(dir, 2.5);\n" +" proj = adir.y >= ma ? projy : proj;\n" +" proj = adir.z >= ma ? projz : proj;\n" +" vec3 stc = vec3(proj.xy * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" +" stc += vec3(vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" " return stc;\n" "}\n" "# endif\n" @@ -2221,55 +2189,23 @@ const char *builtincgshaderstring = "# ifdef USESHADOWMAPVSDCT\n" "float3 GetShadowMapTC2D(float3 dir, float4 ShadowMap_Parameters, samplerCUBE Texture_CubeProjection)\n" "{\n" -" float3 adir = abs(dir);\n" -" float4 proj = texCUBE(Texture_CubeProjection, dir);\n" -" float ma = max(max(adir.x, adir.y), adir.z);\n" -" float3 stc = float3(lerp(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc.xy += proj.zw * ShadowMap_Parameters.y;\n" -" stc.z += ShadowMap_Parameters.z;\n" -" return stc;\n" +" float3 adir = abs(dir);\n" +" float ma = max(max(adir.x, adir.y), adir.z);\n" +" float4 proj = texCUBE(Texture_CubeProjection, dir);\n" +" float3 stc = float3(lerp(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" +" stc += float3(proj.zw * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" +" return stc;\n" "}\n" "# else\n" "float3 GetShadowMapTC2D(float3 dir, float4 ShadowMap_Parameters)\n" "{\n" " float3 adir = abs(dir);\n" -" float2 tc;\n" -" float2 offset;\n" -" float ma;\n" -" if (adir.x > adir.y)\n" -" {\n" -" if (adir.x > adir.z) // X\n" -" {\n" -" ma = adir.x;\n" -" tc = dir.zy;\n" -" offset = float2(lerp(0.5, 1.5, dir.x < 0.0), 0.5);\n" -" }\n" -" else // Z\n" -" {\n" -" ma = adir.z;\n" -" tc = dir.xy;\n" -" offset = float2(lerp(0.5, 1.5, dir.z < 0.0), 2.5);\n" -" }\n" -" }\n" -" else\n" -" {\n" -" if (adir.y > adir.z) // Y\n" -" {\n" -" ma = adir.y;\n" -" tc = dir.xz;\n" -" offset = float2(lerp(0.5, 1.5, dir.y < 0.0), 1.5);\n" -" }\n" -" else // Z\n" -" {\n" -" ma = adir.z;\n" -" tc = dir.xy;\n" -" offset = float2(lerp(0.5, 1.5, dir.z < 0.0), 2.5);\n" -" }\n" -" }\n" -"\n" -" float3 stc = float3(tc * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" -" stc.xy += offset * ShadowMap_Parameters.y;\n" -" stc.z += ShadowMap_Parameters.z;\n" +" float ma = max(max(adir.x, adir.y), adir.z);\n" +" float4 proj = float4(dir.zyx, 0.5), projy = float4(dir.xzy, 1.5), projz = float4(dir, 2.5);\n" +" proj = adir.y >= ma ? projy : proj;\n" +" proj = adir.z >= ma ? projz : proj;\n" +" float3 stc = float3(proj.xy * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" +" stc += float3(vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" " return stc;\n" "}\n" "# endif\n"