【分享】自定义渲染应用——图片遮罩合批

###niubility

谢谢分享
前段时间是在找图片遮罩这方便的技术。
正好也实现了,其实好像只要能把遮罩的纹理坐标使用自己渲染数据格式输入到shader中就可以了,好像不用什么坐标变换的。
我的实现方式是这样的。改造cc.Sprite 为MaskSprite添加一个maskFrame的cc.SpriteFrame设置遮罩的纹理帧,自定义MaskAssembler在渲染数据后面加一个UV1数据, 在更新MaskAssembler顶点的时候使用maskFrame填充UV1。在渲染器中定义mask的sampler2D, 然后直接texture(texture, v_uv0) * texture(mask, v_uv1) * v_color;就可以了。

主要是要注意cc.Sprite不要要用trim模式,而且他的spriteFrame也不能裁剪,否则会影响到渲染顶点的坐标(如果裁剪,顶点坐标可能缩小),当然maskFrame也不能裁剪,否则和spriteFrame的UV坐标对不上了。

用纹理遮罩确实不需要坐标变换,你的做法跟我上面第二种是一样的。
对透明裁剪后纹理的处理,得根据具体业务场景。Demo里是允许蒙版和底图尺寸不一样,底图总是等比缩放填充整个节点,蒙版采用拉伸的简单处理方式。如果不希望蒙版被拉伸或者蒙版被裁剪了,还是需要对蒙版做一次坐标映射。

mark一个,好东西

mark+1

请教一下,那个圆形遮罩会有个拉伸的动画,那个要怎么去掉。

float r = 0.5 - abs(sin(cc_time.x * 2.) * 0.02);    // some trivial animation

应该是这里吧,半径按时间变化的,所以有个动画

非常感谢,原来是在这里。。

mark!!!

mark!!!

mark!

3.4.2 v_xrange无效 :sob:我该去哪里查询对应的参数

不好意思,这套东西不知道3.x能不能用啊 :rofl:,还没试过。

果然战略MARK

1赞

image image 为啥透明区域会被填充上黑色

赞,离全程1dc的目标又近了一步

mark…

你好 我是shader小白 问一下 改了shader不是代表材质变了么?材质变了 不就打断合了?不是很理解 请指教

改了shader后,材质就改了,但是贴主说的合批是指的是这些这遮罩图之间的合批。
也就是说你有100个图,都使用了这个方式去遮罩,这一百个图用的是同一材质,那么这一百个图只占用1个drawcall。

2赞

而你我的英雄,你是真的优秀!!! :star_struck:

1赞