动态生成图片的需求

??又不用全显示

shader 可以自己写规则读取合图文件的

可以合,要在片段着色器里面去取合图特地位置的texture,
只是这么处理drawcall问题依然存在

就是要全部显示,不然没必要这么麻烦了不

通过传入顶点来分割图片 是可以合批的

老哥哥,怎么说?


他说的是这个文章

我当初觉得改动有点深了
不知道实际应用是否适应的了复杂的业务场景,
你可以试试

(shader 圆形头像 合图) + 合批 可以完美解决

shader,跟合批冲突了

这个改动其实是可以弄一个新sprite 来继承老spirte, 然后把引擎里的simple.ts,splice.ts 等assembler 拷一份出来, 放到自己项目, 然后新sprite 复写一下assembler的初始化改为取你魔改的imple.ts,splice.ts就能弄一个新的sprite跟老的sprite一起用又不用改动引擎, 唯一缺点是新sprite和老sprite不能共同一个material

您好, 我也是想在3.x中使用自定义顶点合批。你是使用的 utils.createMesh 方法吗。

不是,3.x版以sprite为例,需先继续Spritem,然后复写函数requestRenderData,这个父函数可以查看引擎源码的ui-renderer.ts ,其中RenderData.add([添加你想要的参数]) 比如:
RenderData.add([
new gfx.Attribute(gfx.AttributeName.ATTR_POSITION, gfx.Format.RGB32F),
new gfx.Attribute(gfx.AttributeName.ATTR_TEX_COORD, gfx.Format.RG32F),
new gfx.Attribute(gfx.AttributeName.ATTR_COLOR, gfx.Format.RGBA32F)
])
最后就是我上面回复的处理,把需要值塞到buffer里

2赞

ok 谢谢大佬,插个眼,等项目做完了回来看看怎么弄

参考这个:https://forum.cocos.org/t/topic/152774/10

你一个屏幕同时显示几千个头像吗?都用同一个shader的话头像是可以合批的

多的可能上千,都是用的同一个,目前没找打何时的方法去进行合批

卧槽,大开眼界!

3.x 的这个自定参数相关的能单独开贴分享下吗?很想学习下!

如果你动态生成的图集的样式是固定的。例如一个图集里有10x10个头像。那么只要将shader改一下,加一个网格化处理就行了。
一个普通的单图的圆形裁切,一般是按0.5,0.5为中心,用uv+sdf来做计算判定。
现在改成,将uv 乘以10,取小数部分,这时取出的值就是当前头像的局部uv。用这个数据去做sdf计算即可

https://forum.cocos.org/t/topic/154029 用自定义顶点实现圆角矩形或圆形裁切。脚本写好了,直接用就行。