cc.Mask 如何使用自定义 shader

最近在使用 cc.Mask 制作擦除的效果,这个论坛有很多分享,实现起来也比较容易。
我现在的做法是,添加一个 cc.Node + cc.Mask,设置类型为 RECT + inverted。然后子节点挂一个单色的Node。

然后直接使用 mask._graphics 画图形,比如画个圆,就有效果了

但是我现在想要圆的边缘有点模糊渐变,于是想要使用一个自定义 shader 来实现。

但是下面的代码会报错:

var material = new cc.Material();
material.effectAsset = this._myEffectAsset; // 我自己的已经加载好的 effect
material.name = "test";
mask._graphics.setMaterial(0, material);

报错:

然后我又试了下:

var material = new cc.Material();
material.effectAsset = this._myEffectAsset; // 我自己的已经加载好的 effect
material.name = "test";
mask.setMaterial(0, material);

这样运行不会报错了,但是也不再会有画出圆的效果了。

我一开始以为我的 shader 有问题,然后我看了下 mask 的源码,发现他用的是 builtin-2d-sprite 这个 shader,于是我就把这个文件的内容完全复制到了我的 shader 里,结果运行起来还是看不到任何的效果。

估计是还有什么地方我做的不对,希望有大佬可以指点一下 ~~~

你应该看看graphics那个shader

graphics没有texture, 所以没有uv坐标

我看过,也试过用 mask._graphics.setMaterial 去使用 builtin-2d-graphics 的 shader 也是报错。然后我看源码发现 mask 的 Grapihcs 用的是 builtin-2d-sprite 这个 shader,所以我也试了下,结果还是错 ~~~

围观中。。。