Node(里面多个sprite)进行遮罩最佳实践要怎样做?

2d项目 需求:
d9abb91153814536edc06174e9d13c6
图中 美术效果希望达到:位置1要遮2, 2要遮3, 3又要遮1
简单的节点排序是达不到这个效果的,目前想借助遮罩,节点程序排序1遮2, 2遮3, 1遮3, 然后再1上面再叠加1对3做遮罩,进而实现 3遮1的效果。

换一种描述需求:
微信图片_20241126173011
如图:有装饰A, B、C,某些情况下,需要用B、C做遮罩,显示最终下面黑色A的效果。
B、C的尺寸一般不会很大(不超过300*300)

问题:Mask有遮罩类型 Sprite_stencil,但是只能配置1张图片,如果想用多张图进行遮罩,怎样实现性能最好(内存+cpu)?

尝试借助 RenderTexture 用另外的相机渲染node(里面有B+C),然后作为Sprite的纹理用做遮罩。有个问题是RenderTexture 尺寸很大(和画布尺寸一样大)这样就比较耗内存。地图上这种遮罩装饰可能会比较多(几十个)

请问这个需求怎样做比较好呢?

拿到顶点坐标,自己用assembler来画,但是这个方法只能裁剪当前图片,对子节点无效

大佬,不好意思没太明白,能麻烦说详细些吗

如果图片中不包含半透明像素的话(alpha要么为0要么为255),你可以自己写一个材质,把纹理及其坐标都传进去,自己实现一套模板测试的逻辑

自己写shader实现是吗,不太熟 :joy: 我去研究下 :joy:

shader和assembler都可以实现你的需求

shader比较简单,但是性能差不能合批

assembler比较难,性能高可以合批

还有一种思路:不借助相机和rt, 直接把多个图的Texture2D通过复制像素 合并成1个 Texture2D,再生成Sprite做遮罩,不知道是否存在什么问题?

引用 远程加载多个方形头像+合图+合批+圆形裁剪

其实,可以不用rt ( rt做遮罩数据也不错 ),

用单个mask遮罩节点,在填充模式时候做处理

把同层所有mask填充模式,收集过来做一次遍历绘画

(交由引擎控制,如果是相同的填充(不同也会打断),应该是可以合批)

动手能力强,也可以自己处理,就是弄在同一张模板测试数据

3D的话,可以通过z轴倾斜实现

是2d项目

我需要些时间去理解大佬说的 :joy:

刚看了下你这图,是你想复杂了吧,就算实现了任意遮罩,你也很难在运动中始终保持正确遮挡

给你个思路
image

把熊头和熊身切成2个节点,独立参与排序

高台、右边小熊身体高度都是0

左边小熊身体、右边小熊头高度是1

左边小熊头高度是2

先按高度排,高度越小越先画

同高度的y越大越先画

上图只是举例,类似这种熊的素材会很多,把素材部位拆分节点的方式可能不合适
1、切素材工作量大
2、上图2是积木,可以堆高,高度不固定的,熊怎么切都不行。

高度不固定,但是每叠一层高度+1,最终按高度数值排序就可以反映遮挡关系

算法就是还原事物的客观本质,你觉得哪个方案更接近遮挡逻辑的本质

我们再想想,多谢

最好的办法就是干掉这个美术,换一个听话的

2赞