关于Unity半透粒子渲染时被打断批次的研究

  • 介绍

粒子被打断的主要原因主要有以下几个

  1. 材质不同
  2. 材质相同但是有修改过默认的渲染参数
  3. 多pass材质(相当于中间又修改了管线的配置)
  4. Scale缩放为负(粒子缩放是可以合批的,但是为负不行)

  1. 渲染层级关系导致合批失败(主要问题,实测项目中组合粒子的Sorting Group的Order in Layer如果相同,也会打断合批)

因为半透粒子是从后往前渲染,这样后面的粒子才能进行正确的混合操作,所以粒子在渲染时,如果遇到相同Order in Layer时,就会按照先后顺序渲染。此时,即使有同类型的粒子,也会因为先后顺序的不同,导致同样的粒子可能在不同的批次进行渲染。

如下所示:

        首先,修改了一个Order in Layer都为10的粒子,里面生成了2张图片,棕色的粒子处于上层,在场景中放置两个该粒子,就得到下图结果

使用Frame Debug就会发现他们分成四次渲染

即使粒子与粒子之间没有重叠,也会出现该情况

现在把粒子的Order in Layer设置为不同值,分别为10,11,结果为下

更改不同的Order in Layer后,批次由4次减少到了2

但是对比之前就会发现实际效果并不一致

        因为合批渲染后,小的箭头层级更高,是后渲染的,所以一定会覆盖大箭头,导致实际效果发生改变。这是粒子合批的一个很大的缺点。如测试的八爪鱼Boss,最后会爆黑白雾气,按照该方案合批,就会出现黑雾永远在白雾上方或下方,而不是黑白相间,这点需要特别注意,如下图:

        需要特别注意组合的技能,即使底下的粒子有单独设置不冲突的Order in Layer,但是因为父级组件带的Sorting Group与其他组合技能冲突了,依然会打断        例如下图

此时修改该技能Model组件的Sorting Group->Order in Layer值为3后再进行测试

        此时第三及后面的批次都是在渲染其他物件了,两种粒子分为两个批次完成渲染,没有被打断。

        火焰技能也是同样的情况,之前的火焰遇到人物时会被打断,主要是因为其上的Sorting Group->Order in Layer值为0,与角色冲突,导致渲染时被断成几次渲染,将Sorting Group->Order in Layer改值为4,会先渲染角色,然后一次渲染火焰。如下

···             

没有出现打断批次的情况,一次渲染完所有火焰

  • 解决方案

        目前项目中,角色、怪物、玩家粒子、怪物粒子都处于Character层,所以需要对Character层中的各个物件划分不同的区域以避免因Order in Layer相同而导致打断批次的情况。

        粒子及Sorting Group的Order in Layer设置参考:

        如果是组合粒子或者父级的组件含有Sorting Group,那么 的Order in Layer与粒子的Order in Layer设置保持一致。预制体的Sorting Group的Order in Layer 覆盖 父预制体的Sorting Group的Order in Layer。预制体的Sorting Group的Order in Layer覆盖单独粒子的Order in Layer。(子预制体>父预制体>粒子)

0 ~100 留空,以便以后有额外需求

101~150 怪物的雾气、火焰类效果

151~200 玩家的雾气类效果,如毒气枪(理论上玩家和怪物雾气不应该覆盖子弹)

201~300 小怪的子弹粒子

301~400 精英的子弹粒子

401~500 Boss的子弹粒子

501~600 玩家的子弹粒子

  • 26
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值