动态合图与shader

前提:为了不打断DC,所有开启动态合图。
其次:为了不打断DC,所以微信头像裁圆的方式选择了使用shader去裁剪。
然后:因为动态合图,所以微信头像图片的uv变化了,所以将合图后的uv传到shader里,进行uv校正处理。
最后:比如有10个不同的微信头像,都是用的同一个shader,然后这样裁剪只有最后一个头像正确裁剪成圆形,其他的都显示不出来。
猜测: 是否因为shader并不是实例后的shader,所以,导致10个循环过后,shader里面只有最后一次的uv校正数据。
提问,有没办法,让不同10微信头像,动态合图后,统一裁成圆形,且不打断DC

看起来感觉是前面的uv都没对啊,有没有查看过动态合图的情况,大致比较一下uv对不对。
你本来的做法是没问题的,问题是出了bug。

能实现你的需求方法其实挺多。
1.比如在图片上传到gpu前切好,但这个操作是在cpu做的,速度慢不太建议。

2.又比如上传到gpu后用shader切圆形,cocos应该是从上传后的纹理加入动态图集的,所以要在动态合图之前做这个事,这个好处是可以跟其它图片合批而不限于头像。

3.还有一个就是你这个方法了。

1.先下载头像合并一个textrue2D里面
2.然后用assember 负责切图 (避免打断合批)
3.使用一个圆形shader
完成

我是在加载后,延迟了一段时间,然后将spriteFrame里的uv(此处应该是动态合图后的uv了),用循环将合图后的uv,传到shader里,进行处理。最终循环的几个里面,只有最后一个正确显示了,所以我才想会不会是shader是统一的,而不是实例化的,所以从设置10个合图后的uv,只有最后一个覆盖了前面的结果,所以只有最后一个的uv是正确的。(主要是是shader无法打印,如果有bug,要找出来其实非常耗时间)。另外,能具体说说你列举的第2个方法吗,学习一下,谢谢!

能详细说说吗,谢谢

延时了不一定是就是动态合图之后的uv吧我咋觉得有问题

你是卡在那一步了

实际上,那个时候,我已经看到动态合图里面有这些图片了,所以应该是正确的uv了

因为之前没有做过这类的处理,所以不知道你说的这些具体用到那些api,所以,请赐教[抱拳]

合图成功了 就用assember负责切图的

assember这个api没有找到

搜索这个 Assembler

好的,我晚点研究一下,谢谢

用顶点裁切。

自己做个组件,自己实现Assemble。参考mask组件的圆形裁切。组装顶点数据。

我查了些资料,感觉你这个传uv的方式做不了了。
因为cocos 里面给shader传参是uniform,这意味着你10个头像一次提交绘制时,这10个头像访问到的值都是相同的,也就是你出现的情况,只有最后一个正确绘制。你可以让这10个头像断批试试,应该10个就能正确绘制,但也就断批了。

第二个方法也许需要改引擎,原理其实也简单,你调出动态合图的情况来看,可以看到10个头像在一张大图里,假如这10个在大图里的头像都是早就切好的圆形呢,那就能按照普通情况合批了对吧。
这个就是要自己在下载上传到gpu之后切一下。

只有一个显示并裁剪 可以看看几何坐标是否都正确,别搞得都算的是同一个几何坐标了 都重叠在一起了

动态图集合图的时候,把微信头像搞成圆的 :upside_down_face:

哈哈. 我倒觉得这样最好.
源头数据预先处理,就没后面什么事情了.
就如同cdn的资源链接后缀加上类似_round标签一样(cdn云端处理).

不过要考虑图片的处理数量是否会导致游戏卡顿.

可以详细说说怎么弄吗