合批的前提只是,shader中没有切纹理,使用了同一个着色器,使用了同样的混合参数。
所以就算你们定制了shader,但是你们一次性传入了所有的头像的顶点,那就能在一次draw中合批。
另外,因为你们是远程图集,所以就意味着你的所有头像都是散图。
所以为了让这些图进行合批,最好先自己管理一份Texture,先把散图画到Texture上,再用这个Texture去渲染就行了
要先把头像进行动态合图,然后再自定义顶点参数把uv最大与最小传给shader,再处理圆形就行,你那是弹幕游戏吧,一看就是同行了
这条回复比较实用。解释了合批的条件,以及根据你的实际情况怎么去动态合图。楼主可以按着这个思路去解决
同求,目前一直没找到好的解决方案
自己写合并纹理的算法,记录对应头像的uv,这样所有头像使用的是同一个着色器
大佬们,有没有什么在线的API能够将方形图片处理成圆形,这种感觉最简单。
我对shader几乎不会,用的是别人写的。还有就是散图合图和shader传UV这些也不太会。
这种需求量我觉得很大,就是加载远程头像然后shader实现圆形并实现合批。希望高手可以做个插件,我一定会买。
在线api处理的也是无法合批的呀
是否合批和圆形没任何关系
引擎是可以实现动态合图的吧。因为我现在用shader,所以把动态合图禁用了。因为不禁用,shader后显示不到正确的图片。如果在线API处理。就不需要shader了。引擎还能动态合图。不就可以了吗
显示不到正确的图片可能是因为头像资源是动态加载的资源,动态加载的图片好像也可以设置成动态合图
动态加载的图片默认就是动态合图的,就是因为合成大图了,shader圆形头像就显示不正常了。UV什么的变化了。
动态加载的图片创建的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的预处理参数, 直接通过url在浏览器打开是正常裁切好的, 但是在cocos游戏中 使用同样url来loadRemote,下载并加载显示出来 是没有裁切的。 不知道为啥
你发个demo 或你那图的url出来看看, 我用是没有问题的
神奇, 我浏览器双开, 一个是圆的一个是方的, 同样的代码。 然后怕是之前的缓存,还浏览器重启了一下 还是这样
重启没用, 清空浏览器数据,包括缓存图片那些才行哈哈哈哈哈, 已经可以了 ,谢谢老哥啦