diff --git a/leenkx/Shaders/std/shadows.glsl b/leenkx/Shaders/std/shadows.glsl index ff02a734..5573fd9c 100644 --- a/leenkx/Shaders/std/shadows.glsl +++ b/leenkx/Shaders/std/shadows.glsl @@ -75,9 +75,15 @@ vec3 PCFTileAware(sampler2DShadow shadowMap, #ifdef _ShadowMapTransparent if (transparent == false) { - vec4 shadowmap_transparent = texture(shadowMapTransparent, uv); - if (shadowmap_transparent.a < compare) - result *= shadowmap_transparent.rgb; + vec3 transResult = vec3(0.0); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + vec4 smt = texture(shadowMapTransparent, + clamp(uv + vec2(x, y) / smSize, tileMin, tileMax)); + transResult += (smt.a < compare) ? smt.rgb : vec3(1.0); + } + } + result *= transResult / 9.0; } #endif @@ -142,9 +148,15 @@ vec3 PCF(sampler2DShadow shadowMap, #ifdef _ShadowMapTransparent if (transparent == false) { - vec4 shadowmap_transparent = texture(shadowMapTransparent, uv); - if (shadowmap_transparent.a < compare) - result *= shadowmap_transparent.rgb; + vec3 transResult = vec3(0.0); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + vec4 smt = texture(shadowMapTransparent, + uv + vec2(x, y) / smSize); + transResult += (smt.a < compare) ? smt.rgb : vec3(1.0); + } + } + result *= transResult / 9.0; } #endif @@ -187,9 +199,19 @@ vec3 PCFCube(samplerCubeShadow shadowMapCube, #ifdef _ShadowMapTransparent if (transparent == false) { - vec4 shadowmap_transparent = texture(shadowMapCubeTransparent, ml); - if (shadowmap_transparent.a < compare) - result *= shadowmap_transparent.rgb; + vec3 transResult = vec3(0.0); + vec4 smt = texture(shadowMapCubeTransparent, ml); + transResult += (smt.a < compare) ? smt.rgb : vec3(1.0); + for (int x = -1; x <= 1; x += 2) { + for (int y = -1; y <= 1; y += 2) { + for (int z = -1; z <= 1; z += 2) { + smt = texture(shadowMapCubeTransparent, + ml + vec3(x, y, z) * s); + transResult += (smt.a < compare) ? smt.rgb : vec3(1.0); + } + } + } + result *= transResult / 9.0; } #endif @@ -385,9 +407,15 @@ vec3 PCFFakeCube(sampler2DShadow shadowMap, #ifdef _ShadowMapTransparent if (transparent == false) { - vec4 shadowmap_transparent = texture(shadowMapTransparent, uvtiled); - if (shadowmap_transparent.a < compare) - result *= shadowmap_transparent.rgb; + vec3 transResult = vec3(0.0); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + vec4 smt = texture(shadowMapTransparent, + clamp(uvtiled + vec2(x, y) / smSize, 0.0, 1.0)); + transResult += (smt.a < compare) ? smt.rgb : vec3(1.0); + } + } + result *= transResult / 9.0; } #endif diff --git a/leenkx/Sources/leenkx/renderpath/Inc.hx b/leenkx/Sources/leenkx/renderpath/Inc.hx index fb99c702..b779b1cb 100644 --- a/leenkx/Sources/leenkx/renderpath/Inc.hx +++ b/leenkx/Sources/leenkx/renderpath/Inc.hx @@ -333,7 +333,7 @@ class Inc { var shadowmap = getShadowMapAtlas(atlas, true); path.setTargetStream(shadowmap); - path.clearTarget(0xffffff, 0.0); + path.currentG.clear(0xffffffff, 0.0); for (tile in atlas.activeTiles) { if (tile.light == null || !tile.light.visible || tile.light.culledLight @@ -549,7 +549,7 @@ class Inc { for (i in 0...faces) { if (faces > 1) path.currentFace = i; path.setTarget(shadowmap_transparent); - path.clearTarget(0xffffff, 0.0); + path.currentG.clear(0xffffffff, 0.0); if (l.data.raw.cast_shadow) { path.drawMeshes("shadowmap_transparent"); } diff --git a/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx b/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx index 580c30d0..1059225c 100644 --- a/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx +++ b/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx @@ -543,7 +543,7 @@ class RenderPathDeferred { t2.format = "RGBA64"; path.createRenderTarget(t2); path.setTarget("empty_shadowmap_transparent"); - path.clearTarget(0xffffffff, null); + path.currentG.clear(0xffffffff, null); #end } #end