Creator v2.0.0 不再支持龙骨单 slot 的 替换纹理功能了 (未来是否支持单 Node 多 material 的情况)?

我们的需求场景

用 dragonbones 实现的局部换装 ,如"将一个人物骨骼的衣服替换为一个独立纹理的 spriteFrame".(衣服是一个纹理,其他部位是一个纹理)

问题是

2.0.0以前的渲染机制是可以满足需求的,但是2.0.0不再支持了.

原因:

RenderComponent 作为渲染组件基类,定义了唯一的 Material .而 Material目前的实现 SpriteMaterial 也 定义了唯一的 Texture. 故: 每个 RenderComponent 都只能使用一个纹理.
而一个 dragonbones 实例(ArmatureDisplay) 在 Creator 中是管理在一个 Node 中的.

所以:

一个 dragonbones 实例(ArmatureDisplay) 只能使用唯一的 Texture
所以感觉难以通过简单且易维护的修改扩展出"局部换装"功能.

我能想到的解决办法(感觉很靠谱):

在 dragonbones 的 assemble.fillBuffers 中做修改
1.先 buffer.request
2.然后 buffer.flush
3.在做一系列 render-flow 实现的初始化操作 , 准备到新纹理的 组装状态
4.然后 buffer.request
5.最后 在还原回 步骤2 开始前的状态.

我们很想升级到v2.0,但是升级前这个问题必须解决才可以.
希望大家指点. :slightly_smiling:

4赞

分析得挺到位的,解决方案虽然具体做法上有点偏差,不过基本思路差不多:在 fillBuffers 中需要对不同的 DB 骨骼动态生成或获取 material,生成多个 render datas,并返回即可。至于 flush,其实大多数情况下不需要手动处理,在 material 打断 render datas 时,在 request 新的 buffer 并且 buffer 超过最大尺寸时,都有自动 flush 的逻辑。

这里解释一下 material, render data 和渲染批次的设计,SpriteMaterial 虽然只支持一个 texture,不过在 DB 的用例中是没问题的,DB 的每个部分都只需要一个纹理,没有多纹理同时渲染一个部件的需求,所以这里的工作实际上是将一个 DB 对象拆分成不同的 render datas,每个 render datas 代表一个渲染单位的数据,这些 render datas 在 render component walker 中会被组装成 Model(符合批处理渲染条件的 render datas 会被打包在一个 model 中)。最终一个 Model 就是一个渲染批次。

你可以参考一下 Spine assembler 的实现,里面就是动态获取 material 的,并且完成了 material 的复用。

https://github.com/cocos-creator/engine/blob/v2.0-release/extensions/spine/spine-assembler.js

1赞

非常感谢! 讲得好清楚, 原来是在 render data 这里留好了口,好棒的设计.:+1:

大哥 怎么问题怎么决解啊

不是说,招了专门的大佬来负责这块吗?什么时候能解决这个问题?

急啊a