From a9d1525ea70611e5b31c6bdf138b3a41bd884637 Mon Sep 17 00:00:00 2001 From: le888 <11625590+le888@users.noreply.github.com> Date: Mon, 9 Nov 2026 17:05:03 +0800 Subject: [PATCH] Fix soft mask parameter synchronization for stencil materials --- Runtime/Scripts/Effects/SoftMaskScript.cs | 44 +++++++++++++++++------ 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/Runtime/Scripts/Effects/SoftMaskScript.cs b/Runtime/Scripts/Effects/SoftMaskScript.cs index fbd8647..433741a 100644 --- a/Runtime/Scripts/Effects/SoftMaskScript.cs +++ b/Runtime/Scripts/Effects/SoftMaskScript.cs @@ -11,6 +11,7 @@ namespace UnityEngine.UI.Extensions public class SoftMaskScript : MonoBehaviour { Material mat; + Graphic cachedGraphic; Canvas cachedCanvas = null; Transform cachedCanvasTransform = null; @@ -63,13 +64,14 @@ void Start() return; } - var graphic = GetComponent(); - if (graphic != null) + cachedGraphic = GetComponent(); + if (cachedGraphic != null) { mat = new Material(ShaderLibrary.GetShaderInstance("UI Extensions/SoftMaskShader")); - graphic.material = mat; - cachedCanvas = graphic.canvas; + cachedCanvas = cachedGraphic.canvas; cachedCanvasTransform = cachedCanvas.transform; + SetMask(); + cachedGraphic.material = mat; } } @@ -85,18 +87,38 @@ void SetMask() { var worldRect = GetCanvasRect(); var size = worldRect.size; + if (size.x == 0f || size.y == 0f) + return; + maskScale.Set(1.0f / size.x, 1.0f / size.y); maskOffset = -worldRect.min; maskOffset.Scale(maskScale); - mat.SetTextureOffset("_AlphaMask", maskOffset); - mat.SetTextureScale("_AlphaMask", maskScale); - mat.SetTexture("_AlphaMask", AlphaMask); + ApplyMask(mat); + + if (cachedGraphic == null || !cachedGraphic.isActiveAndEnabled || cachedGraphic.material != mat) + return; + + // A parent Mask can give the renderer a cached stencil copy of our material. + var renderer = cachedGraphic.canvasRenderer; + if (renderer.materialCount == 0) + return; - mat.SetFloat("_HardBlend", HardBlend ? 1 : 0); - mat.SetInt("_FlipAlphaMask", FlipAlphaMask ? 1 : 0); - mat.SetInt("_NoOuterClip", DontClipMaskScalingRect ? 1 : 0); - mat.SetFloat("_CutOff", CutOff); + var renderingMaterial = renderer.GetMaterial(0); + if (renderingMaterial != null && renderingMaterial != mat && renderingMaterial.shader == mat.shader) + ApplyMask(renderingMaterial); + } + + void ApplyMask(Material material) + { + material.SetTextureOffset("_AlphaMask", maskOffset); + material.SetTextureScale("_AlphaMask", maskScale); + material.SetTexture("_AlphaMask", AlphaMask); + + material.SetFloat("_HardBlend", HardBlend ? 1 : 0); + material.SetInt("_FlipAlphaMask", FlipAlphaMask ? 1 : 0); + material.SetInt("_NoOuterClip", DontClipMaskScalingRect ? 1 : 0); + material.SetFloat("_CutOff", CutOff); } public Rect GetCanvasRect()