Unreal虚幻引擎中带毛发角色
Avatar换装系统处理
概述
本文先简单回顾了基于SHELL多层毛发的渲染原理,带有毛发的角色基础设计,以及在换装实现中遇到的问题和探讨。出于篇幅考虑 不涉及过多的技术向细节。
毛发渲染
我们先来看带毛发的角色,比如复联里的Rocket 浣熊。
游戏不同于电影,电影可以不计性能渲染美化怎么美怎么来,游戏中要渲染这么多毛发,对GPU 的要求很高,在移动端更是中挑战。那怕有电影级的游戏引擎效果也是尽力平衡着向电影效果逼近。
常见的做法有用多面片拉丝配shader美化(人物头发), 还有一种是基于 Shell 多层渲染(多用于动物等全身覆盖毛发)。
基于shell多层毛发渲染
基于shell 的渲染就是把一根毛发按距离切片,有点像同一张纸牌放置(绘制)多次。
绘制的层越多则越细腻,越接近真实的毛发。(当然性能消耗也大)
实际在绘制时,我们需要提供给渲染系统,原始皮毛材质,皮肤表面毛发的生长法线,皮肤上毛发是有间隙的,还要提供皮毛的出生点等。经过多层渲染,加入一些可变参数的调整,可以模拟出较为真实的皮毛覆盖。
带毛发的角色换装设计
,
单纯的绘制带皮毛的角色,它可能就是一只未着装的动物,如上图右边的“替身”。而我们需要的是角色可以在游戏里换装:
就像Rocket 一样可以穿著防弹背心,也可以来个宇航服, 戴个防护眼镜,蹬个太空鞋,持不同的武器等等。
首先,跟传统的人类换装一样,需要定义可以换装的部位,比如,头,躯干,手,腿。:
其次,带毛发的多为动物会有一些特殊性,比如会有尾巴,还会有裸妆(变身动物)的场合。
带毛发的角色在“着装”时还需要对着装的部位进行处理,进行整块MESH替换,或显隐控制。必要时需要把毛发进行剪短和“剔除”等工作。
Avatar换装系统实践
Unreal 虚幻引擎本身有毛发系统,可以调节的特性多参数多,效果也相当好,但是对设备的性能要求高,目前还不能很好的支持移动端。
Unity3d 引擎用了快十年,它对移动端布局早且兼容尤佳,要实现个皮毛角色也是较为方便。在着色器(Shader)方面,弄个多层渲染(多通道PASS)是较为方便的(HRP高清渲染另说)。
Unreal 作为AAA次世代引擎,有限制,有难度,但是依然值得我们去探索。
首先,在前面策划层面定义好各个身体部位后,可以开始建模。
建模时需要定义好各个换装部位的虚拟绑定点(dummy点),比如头饰,尾饰,翅膀,躯干,手脚掌,武器挂载点等。
其次,为Mesh定义Spline 样条线,这个spline 会随着模型导入到Unreal中(用于提供皮毛渲染层更多的信息以控制生长方向,力的控制等)。
再次,技术方面需要实现一套皮毛渲染层(控制代码加Shader)以及AVATAR 系统装载替换机制。
最后,在效果和性能方面做取舍平衡,为高中低档移动设备作弹性可选适应。
皮毛渲染层需要提供的主要参数
基础贴图: 就是皮毛角色在“裸妆”是的本色贴图,在为开启皮毛“生长系统“时的原始皮毛。
皮毛NOISE贴图: 就是皮毛角色噪点贴图,用于获取皮毛的出生点,疏密分布等。
控制贴图: 皮毛角色在“植入毛发”时需要的一些信息,比如长短控制,个别个性属性等。
参数类: 皮毛颜色,皮毛长度,致密度,亮度,高光,重力,方向力等 。
特殊性处理
传统的换装系统都较成熟,如果游戏里只是单一角色,需要考虑的问图不会太复杂,可以到此为止。
假如做的是一类角色,比如狼人,兽人,身型固定但身上的毛发长度不一,再或者做个宠物猫换装,这时就要对皮毛的长短进行控制。这种情形往往不能单独靠着色器来简单实现,有些区域毛长有些区域毛短,统一的毛长会穿到衣服外面,这时侯灵活性没了,长长的毛无法被衣物“压”住,衣物长满了穿出来毛,失去了本色美感。
我们解决方法是,通过控制贴图来传入控制信息,告诉皮毛渲染层系统,哪些区域要“植皮”,植多长的皮毛等。
但这些控制贴图控制的是单次换装下来的区域信息,(主要是植毛区域信息)。在玩家穿脱新的服装和装饰物时,这些控制信息需要动态被更新而不是固定死的。
我们解决方法是动态的合成这张控制信息贴图,这张控制信息贴图RGBA 有四个通道,可以需求存储较多的参考信息。
控制区域贴图合成
首先,按照每个换装系统的部位为其“绘制”一张(与原始毛发贴图尺寸一样大)区域部位图。
比如,有头,劲,身,尾巴,手爪,脚掌六个部位。则对应六张控制图。技术定义六个部位的叠加枚举值
#define HEAD 0x0000 0001
#define NECK 0x0000 0010
#define BODY 0x0000 0100
#define TAIL 0x0000 1000
#define HAND 0x0001 0000
#define FEET 0x00 10 0000
玩家在换装时,如果只换了头和手,则得到的就 HEAD + HAND,程序根据枚举值将头和手的控制图合并,动态的替换到换装那一刻的SHADER 的控制图中,让该区域的毛发得以限制,比如让手毛变短(好戴上手套)。
优化
基于Shell 分成渲染的毛发系统都比较吃性能,在主机上效果很好,但在移动端就得优化了。
前面提到,渲染皮毛的层数越多,越逼真,我们针对不同毛发长度的角色做了区分,有些绘三层,有些绘制八层,有些绘制20层。最高不超过20层。
在Unreal 虚幻引擎中可以通过RenderTarget合成材质,出于性能考虑,单次操作我们直接通过CPU 运算完成合成。
材质的特殊性,关于MESH合并我们还在探讨当中,若有好的方案可以分享和或进一步学习。
图片来源于网络
原创文章,转载请标注