shader实现远程加载的圆形头像能否合批?

43953e3fe067484791672d4f1301e677

大佬们,最近做弹幕 游戏,每个玩家和NPC都有一个圆形头像,圆形头像是shader实现的,并且头像是动态远程加载的。因为NPC数量很多,现在drawcall很多。这种方式能实现合批吗?看了很多文档,没找到解决方案。

首先图像要合图,然后分层

看看这个 https://forum.cocos.org/t/topic/154573/2

大佬,我看了。现在就是有一个疑问,你那张图集是本地固定的。如果每个头像都是动态远程加载的能实现吗?

合批的前提只是,shader中没有切纹理,使用了同一个着色器,使用了同样的混合参数。
所以就算你们定制了shader,但是你们一次性传入了所有的头像的顶点,那就能在一次draw中合批。
另外,因为你们是远程图集,所以就意味着你的所有头像都是散图。
所以为了让这些图进行合批,最好先自己管理一份Texture,先把散图画到Texture上,再用这个Texture去渲染就行了

要先把头像进行动态合图,然后再自定义顶点参数把uv最大与最小传给shader,再处理圆形就行,你那是弹幕游戏吧,一看就是同行了

这条回复比较实用。解释了合批的条件,以及根据你的实际情况怎么去动态合图。楼主可以按着这个思路去解决

同求,目前一直没找到好的解决方案

自己写合并纹理的算法,记录对应头像的uv,这样所有头像使用的是同一个着色器

大佬们,有没有什么在线的API能够将方形图片处理成圆形,这种感觉最简单。 :joy:
我对shader几乎不会,用的是别人写的。还有就是散图合图和shader传UV这些也不太会。 :joy:

这种需求量我觉得很大,就是加载远程头像然后shader实现圆形并实现合批。希望高手可以做个插件,我一定会买。

在线api处理的也是无法合批的呀

是否合批和圆形没任何关系

引擎是可以实现动态合图的吧。因为我现在用shader,所以把动态合图禁用了。因为不禁用,shader后显示不到正确的图片。如果在线API处理。就不需要shader了。引擎还能动态合图。不就可以了吗

显示不到正确的图片可能是因为头像资源是动态加载的资源,动态加载的图片好像也可以设置成动态合图

动态加载的图片默认就是动态合图的,就是因为合成大图了,shader圆形头像就显示不正常了。UV什么的变化了。

image 动态加载的图片创建的spriteframe packable 设置为true 看能生效不

那应该改一下你的圆形裁剪逻辑应该就可以了,裁剪应该按照合图后的uv来计算,而不是纹理宽高

1实现合批,首先需要统一材质,同一纹理。
2圆形处理的难点是使用uv做出圆形后,uv不是单张图的0~1了,不能以0.5为中心uv,0.5为半径那样做处理。
使用shader的一个解法是用网格化。先算出当前uv处于网格的哪个行列,然后获得一个想对的uv值来做处理。
这个方式,需要你将纹理整合成固定行列的整图,打个比方5行5列的头像之类的。
具体做法就是上面leehong做的那个shader圆形头像处理方案。

不用shader,使用顶点做裁切,我之前做个一个脚本,直接用这个可以将图像做成圆形。然后合批处理和普通的图片一样处理就行了。这个方案的好处是圆形头像也可以和其他的图片合批,因为不需要自己写shader,材质也是默认的材质。
缺点是裁切出来的边缘放大细看可能会穿帮,这个你可以看具体情况。目前我测试看问题不大。
https://forum.cocos.org/t/topic/154029

可以合批,大概需要两步。
1、需要借助引擎的自动合批功能,或者手工合并头像
2、需要写一个自定义Shader,创建一个自定义材质,来处理圆型遮罩。

需要注意的点:
1、所有头像都必须使用这个自定义材质
2、不要使用Mask来做圆型遮罩,那个会导致合不了批
3、网络上下载下来的头像,分辨率有大有小,记得做一次尺寸处理。

如果你那些头像是在阿里oss上,可以在连接后加oss参数让oss帮你先把图截成圆形文档