diff --git a/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts b/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts index f620e6203c8..8b691c16fc6 100644 --- a/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts +++ b/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts @@ -1244,7 +1244,7 @@ export class ShadowGenerator implements IShadowGenerator { } if (isTransparent && this.enableSoftTransparentShadow) { - effect.setFloat("softTransparentShadowSM", effectiveMesh.visibility * material.alpha); + effect.setFloat2("softTransparentShadowSM", effectiveMesh.visibility * material.alpha, this._opacityTexture?.getAlphaFromRGB ? 1 : 0); } if (shadowDepthWrapper) { diff --git a/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentExtraDeclaration.fx b/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentExtraDeclaration.fx index 726bf67250f..4720730320f 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentExtraDeclaration.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentExtraDeclaration.fx @@ -5,7 +5,7 @@ #if SM_SOFTTRANSPARENTSHADOW == 1 #include - uniform float softTransparentShadowSM; + uniform vec2 softTransparentShadowSM; #endif varying float vDepthMetricSM; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentSoftTransparentShadow.fx b/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentSoftTransparentShadow.fx index ed1f6bc4f12..56973bae6de 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentSoftTransparentShadow.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/shadowMapFragmentSoftTransparentShadow.fx @@ -1,3 +1,3 @@ #if SM_SOFTTRANSPARENTSHADOW == 1 - if ((bayerDither8(floor(mod(gl_FragCoord.xy, 8.0)))) / 64.0 >= softTransparentShadowSM * alpha) discard; + if ((bayerDither8(floor(mod(gl_FragCoord.xy, 8.0)))) / 64.0 >= softTransparentShadowSM.x * alpha) discard; #endif diff --git a/packages/dev/core/src/Shaders/shadowMap.fragment.fx b/packages/dev/core/src/Shaders/shadowMap.fragment.fx index 2c6d2073e5c..eb478178ae3 100644 --- a/packages/dev/core/src/Shaders/shadowMap.fragment.fx +++ b/packages/dev/core/src/Shaders/shadowMap.fragment.fx @@ -15,7 +15,17 @@ void main(void) #include #ifdef ALPHATEXTURE - float alphaFromAlphaTexture = texture2D(diffuseSampler, vUV).a; + vec4 opacityMap = texture2D(diffuseSampler, vUV); + + float alphaFromAlphaTexture = opacityMap.a; + + #if SM_SOFTTRANSPARENTSHADOW == 1 + if (softTransparentShadowSM.y == 1.0) { + opacityMap.rgb = opacityMap.rgb * vec3(0.3, 0.59, 0.11); + alphaFromAlphaTexture = opacityMap.x + opacityMap.y + opacityMap.z; + } + #endif + #ifdef ALPHATESTVALUE if (alphaFromAlphaTexture < ALPHATESTVALUE) discard; @@ -24,9 +34,9 @@ void main(void) #if SM_SOFTTRANSPARENTSHADOW == 1 #ifdef ALPHATEXTURE - if ((bayerDither8(floor(mod(gl_FragCoord.xy, 8.0)))) / 64.0 >= softTransparentShadowSM * alphaFromAlphaTexture) discard; + if ((bayerDither8(floor(mod(gl_FragCoord.xy, 8.0)))) / 64.0 >= softTransparentShadowSM.x * alphaFromAlphaTexture) discard; #else - if ((bayerDither8(floor(mod(gl_FragCoord.xy, 8.0)))) / 64.0 >= softTransparentShadowSM) discard; + if ((bayerDither8(floor(mod(gl_FragCoord.xy, 8.0)))) / 64.0 >= softTransparentShadowSM.x) discard; #endif #endif