在Unity中,Mask和RectMask2D都是用于限制UI元素渲染区域的组件,常常用于ScrollView等需要剪裁内容的场景,但它们的工作原理和对Draw Call的影响是不同的。
1. Mask:Mask组件主要依靠Stencil Buffer(模板缓冲区)来实现遮罩效果。Stencil Buffer是图形硬件中的一种缓冲区,在渲染过程中,Mask会首先在Stencil Buffer中标记其遮罩的区域。然后,在逐像素渲染时,Shader会读取Stencil Buffer的内容判断该像素是否在遮罩内,如果在遮罩内则渲染,不在则忽略。因此,使用Mask组件需要GPU支持Stencil Buffer,且因为需要独立地渲染Stencil Buffer和颜色缓冲区,所以会产生额外的Draw Call。
namespace UnityEngine.UI
{[AddComponentMenu("UI/Mask", 13)][ExecuteAlways][RequireComponent(typeof(RectTransform))][DisallowMultipleComponent]/// <summary>/// A component for masking children elements./// </summary>/// <remarks>/// By using this element any children elements that have masking enabled will mask where a sibling Graphic would write 0 to the stencil buffer./// </remarks>public clas