遮罩
遮罩裁切层级中的子元素,使其仅在遮罩内绘制。滚动视图用它隐藏视口之外的内容,也可用于圆形头像、舷窗和显露效果。

创建遮罩
任意图像元素都可成为遮罩。启用 mask,将要裁切的元素放在其下:
- 引擎
- 编辑器
- React
- Web Components
const viewport = new pc.Entity('viewport');
viewport.addComponent('element', {
type: pc.ELEMENTTYPE_IMAGE,
anchor: [0.5, 0.5, 0.5, 0.5],
pivot: [0.5, 0.5],
width: 300,
height: 200,
mask: true
});
screen.addChild(viewport);
// A 400 × 400 image below the viewport is drawn only inside its 300 × 200 rectangle
const content = new pc.Entity('content');
content.addComponent('element', {
type: pc.ELEMENTTYPE_IMAGE,
anchor: [0.5, 0.5, 0.5, 0.5],
pivot: [0.5, 0.5],
width: 400,
height: 400,
color: new pc.Color(0.23, 0.55, 1)
});
viewport.addChild(content);
勾选图像元素的 Mask,在层级中将待裁切元素移到它下面。
<Entity name="viewport">
<Element type="image" anchor={[0.5, 0.5, 0.5, 0.5]} pivot={[0.5, 0.5]} width={300} height={200} mask />
<Entity name="content">
<Element type="image" anchor={[0.5, 0.5, 0.5, 0.5]} pivot={[0.5, 0.5]} width={400} height={400} color="#3a8cff" />
</Entity>
</Entity>
<pc-entity name="viewport">
<pc-element type="image" anchor="0.5 0.5 0.5 0.5" pivot="0.5 0.5" width="300" height="200" mask></pc-element>
<pc-entity name="content">
<pc-element type="image" anchor="0.5 0.5 0.5 0.5" pivot="0.5 0.5" width="400" height="400" color="#3a8cff"></pc-element>
</pc-entity>
</pc-entity>
遮罩自身不显示,纹理和不透明度只决定子项在哪些位置显示,颜色不生效。需要背景时,可添加填满遮罩的图像作为第一个子项。
形状遮罩
没有纹理或精灵时,遮罩就是元素矩形;有纹理时,则按纹理形状裁切,仅完全不透明像素处显示子项。半透明像素也会隐藏内容,因此遮罩边缘始终是硬边,使用柔边纹理会使实际遮罩略小。
同理,遮罩 opacity 必须保持为 1。小于 1 时,没有任何像素完全不透明,全部子项都会被隐藏。
嵌套遮罩
遮罩可以位于另一遮罩下,子项仅显示在两者重叠范围内。因此嵌套滚动视图,或滚动列表中的圆形图标,都会同时受两层裁切。
遮罩与图层
遮罩在绘制所属图层时通过模板缓冲区工作,因此遮罩与被裁切元素必须在同一图层。若子项移到另一图层,例如为获得深度而移到 World,则完全不会绘制。
画布默认具有模板缓冲区。如果自行创建图形设备时设置 stencil: false,遮罩将无法工作。
遮罩与输入
遮罩同时裁切绘制和输入。元素仅在遮罩矩形内接收输入,因此滚出视口的列表部分不能点击。形状遮罩也只按矩形裁切输入,而非按纹理形状。
开销
每个遮罩增加两次绘制调用:绘制子项前将形状写入模板缓冲区,绘制后清除。内部元素也会与外部元素分开批处理。应按需使用,例如滚动视口,而不是给每个面板都添加遮罩。
遮罩
另请参阅
- 滚动视图:在遮罩视口内滚动。
- 图像元素:纹理、精灵和适配模式。
- 绘制顺序与性能:图层、批处理和绘制调用。
- Element 组件、
<pc-element>和 ElementComponent:全部元素属性参考。