0%

UE 破碎方案

#Blog

UE 破碎方案

破碎效果是游戏中的常见效果,但由于较多复杂的物理计算,通常游戏中都会做离线预先bake的方法来实现破碎,像彩虹六号,Control 这种以破碎为核心体验的游戏,则有专业引擎团队进行大量的物理优化后实现。本文尝试总结了已有一些破碎实现方案,并参考黑客帝国demo后设计的一个半实时模拟的破碎效果,实现实时模拟破碎。

先介绍下已有的方案:(此处参考:https://zhuanlan.zhihu.com/p/608906269)

已有方案

骨骼动画

houdini中用Voronoi fracture制作破碎后通过rbd bullet solver结算动画数据导出为fbx,并在引擎中作骨骼动画播放

顶点动画

houdini中用Voronoi fracture制作破碎后通过filecache节点,Labs vertex animation textures生成vat数据,在houdini中讲VAT材质function迁移到项目中使用。


并将position 和 rotation 两张贴图导入后设置相关材质后,查看破碎效果。

Alembic

使用ROP Alembic Output 将破碎动画导出为abc格式(数据量大)
导入到引擎中,变成几何体缓存,并通过sequence进行播放

chaos

UE5自带破碎系统

前置方案对比

破碎方案 优点 缺点
骨骼动画 骨骼支持二次修改效果可控 碎块越多骨骼数量越多性能消耗越大
顶点动画 基于顶点着色器性能消耗最小 贴图的大小约束了动画数据量的上限
alembic 精度高,兼容性强 体积大
Chaos 碎块与环境的碰撞 碰撞计算量大性能消耗大

可以看到前置方案基本都是预先计算好破碎,并在相应情况下播放相应动画。其中骨骼动画、顶点动画、alembic方案均为离线破碎,无法做好很好的交互效果。chaos虽然是实时物理计算的破碎,但存在消耗计算量大,性能消耗高的问题。
考虑到场景中可能有大量实时玻璃破碎,参考了其他方案后,可以发现:在顶点动画中,可以使用顶点偏移的方式实现mesh的位移,而由compute shader并行计算的Niagara有不少节点可以实现物理模拟,所以可以尝试将Niagara模拟的信息传递到材质的顶点偏移中,实现实时破碎模拟。

Niagara + WorldPositionOffset 实时模拟

技术剖析

破碎部分任然使用预处理的方法提前将碎块碎号,避免Gameplay中大量的实时计算。这个破碎我使用houdini先做默认破碎,并导出pivot painter图到UE引擎。
在Niagara中,我使用pivot painter图的采样,将生成的粒子放置到每个碎片处。然后通过Niagara中的物理模拟,将粒子的物理模拟位置,旋转等信息bake到Pivot painter图上,并传递给Material 做 world position offset 的偏移。

前期处理

houdini处理思路流程图

  1. 导入模型(box位置)
  2. 通过scatter散点,并通过attributewrangle 设置散点的root。
  3. 通过rbd material fracture 对模型根据输入的散点进行破碎。
  4. 对每个碎片进行单独设置root命名设置。
  5. 根据每个片的内外设置顶点色(内切缝处顶点色设置为1)。

  1. 通过houdini自带的pivotpainter工具导出即可。

引擎处理

将处理后的mesh和原mesh及生成的3张PP2贴图导入引擎

Niagara 处理

采样贴图

  • Initialize Component Variables : 采样PP2贴图生成粒子信息及scale

  • Calculate Per Particle Render Target UV Location:根据每个粒子的index信息找到其在PivotPainter2贴图中的UV位置,方便下一步读取。

  • Initialize Component Variables:根据上一步的UV信息读取PP2贴图,并将粒子位置、朝向等设置到对应的世界空间位置,朝向等。(其中读取使用了ms_PivotPainter2_DecodePostion_NF函数)

  • Calculate Mass and Rotational Inertia by Volume : 根据scale设置碎片的mass

设置物理模拟

写回材质

  • Control PP2 Mesh Elements Via Niagara: 通过Niagara将粒子位置信息烘焙回Texture,内部通过将位置差、旋转信息组合成LinearColor后,根据Calculate Per Particle Render Target UV Location计算到的UV信息,将颜色写入到前者的UV上。
  • 并在niagara材质输出部分将相关的RT和参数传递给mesh的material。

Material 解析

WPO解析


材质核心部分在SkinPivotPainter2MeshesViaNiagaraWAccurateVelocity,里面做了pingpong 采样贴图,更好优化卡顿效果。

通过实时计算出来的PP2 采样将位置信息从世界空间转换为MeshParticle空间,与原来的PP2位置计算差值后转到世界空间得到实时的偏移。

加上原来初始偏移在旋转后的位移差与绝对世界位置(包含WPO)相加,最终减掉实时PP2采样的位置,得到实时PP2的位移,乘上缩放量后再叠加原来的偏移即可达到效果.

其他项解析

直接采样模型顶点色做其他项的lerp实现破碎效果。


最终实现效果:
可以控制玻璃破碎方向及破碎力度等。

总结

破碎方案 优点 缺点
骨骼动画 骨骼支持二次修改效果可控 碎块越多骨骼数量越多性能消耗越大
顶点动画 基于顶点着色器性能消耗最小 贴图的大小约束了动画数据量的上限
alembic 精度高,兼容性强 体积大
Chaos 碎块与环境的碰撞 碰撞计算量大性能消耗大
Niagara+PP2 实时 碎块和粒子近似模拟,效率高 贴图较多,需要较好项目管理

3A游戏制作破碎参考

Control

https://www.youtube.com/watch?v=kODJsQGXanU

https://www.gdcvault.com/play/1026820/Destructible-Environments-in-Control-Lessons

RainBow 6

https://www.gdcvault.com/play/1023003/The-Art-of-Destruction-in

https://www.gdcvault.com/play/1022990/Rendering-Rainbow-Six-Siege

fortnites

https://www.gdcvault.com/play/1018192/The-Inner-Workings-of-Fortnite

Uncharted 4: A Thief’s End

https://www.sidefx.com/community/fx-adventures-in-uncharted-4-a-thiefs-end/

参考