【技术精讲】基于AMD TressFX技术的Unity China HairFX ...
李鹏鹏 Unity中国平台技术经理1.毛发渲染技术的难点在哪里
毛皮和头发是一个庞大的主题,在三维游戏、动画和数字人的制作中,毛发效果的表现一直是技术突破的难点之一。
导致毛发渲染的难点都有哪些?
首先,毛发的数量巨大(例:人体一般有8W~13W根头发);
其次,头发种类繁多,形式多样,不同颜色的头发对光线的吸收不同;
最后,头发运动的结算效果复杂多变、难以预测;
2.Unity的毛发解决方案有哪些
我们的游戏和垂直客户,横跨移动设备到高端主机平台,他们经常从 Unity 寻求解决方案。 这就需要Unity 有多个并行开发的头发解决方案以满足各种需求。
[*]Unity China HairFX 毛发系统:
Unity China HairFX 基于AMD 开源 Tressfx 头发框架。 它面向游戏开发者,用于跨平台的实时游戏和过场动画。 它同时支持 URP 和 HDRP,并与 2021 LTS 兼容。 Unity China HairFX 毛发系统也是本篇教程介绍的重点;
2.“Enemies” 毛发解决方案
该解决方案是Unity为 Enemies 演示而开发的,目的是针对实际生产需求进行测试,作为(The Heretic、Book Of The Dead 等)的演示团队和(HDRP、Verticals、ShaderGraph)图形研发团队之间的协作,用于导入/创作/模拟/渲染基于头发的全新、全集成的解决方案 ,从高端数字人类和生物到风格化的小型游戏。
那么我们今天介绍的是Unity 中国团队开发的 Unity China HairFX 毛发系统;
3.Unity China HairFX 毛发系统的简介
Unity China HairFX 是一个基于束的毛发系统,该头发系统基于开源的 AMD-TressFX 头发框架。 Unity China HairFX 支持通用渲染管线 (URP) 和高清渲染管线 (HDRP)。
支持的Unity版本为 2021.2.13f1 +
支持的URP/HDRP包版本为12.1.4 +
Unity China HairFX 毛发系统主要由两部分组成:
1.Maya_TressFX_Exporter:(在Maya里是做发型,导出引导线去Unity )
2.URP / HDRP HairFX Shader Package: (在Unity 渲染和Simulation )
目前基于 AMD-TressFX 头发框架已经广泛用于游戏场景中,其中比较知名的要数 PC 版古墓丽影 ;我们来看一组效果对比;
4.Unity China HairFX 毛发系统的效果展示
这是 Unity China HairFX 毛发系统在Unity编辑器测试效果;(官方案例)
https://www.zhihu.com/video/1605936513530920961
这是 Unity China HairFX 毛发系统在真机上上的测试效果;这是在iphone12上的头发画面效果,并且帧率可以稳定在60帧;(官方案例)
https://www.zhihu.com/video/1606303272569884672
接下来我们来看下 这个是韩国OnMind Inc采用AMD TressFX 使用Unity 做出的效果;
https://www.zhihu.com/video/1606303827841449984
那么接下来我们就来揭开 Unity China HairFX 毛发系统神秘面纱,看下我们如何使用 Unity China HairFX 毛发系统;
5.如何在Maya中安装TressFX Exporter 插件
TressFX Exporter 插件安装步骤:
第一,下载Maya 的 TressFX Exporter 插件:
https://github.com/Unity-China/cn.unity.hairfx.core/tree/main/Maya_TressFX_Exporter~
第二,复制plug-ins文件夹到C:\User\YOUR_USER_NAME\Documents\maya\
(注意:与 Maya 2022 不兼容,目前支持Maya版本为2019)
第三,打开Maya软件,在顶部菜单中会出现TressFX Tool 菜单选项;(如果没有出现,在顶部菜单中找到Windows>Settings/Preferences>Plug-in Manager,然后勾选TressFX_Exporter.py的Loaded选项卡,重新启动Maya)
第四,点击TressFX 菜单选项,选择Export Hair/Fur将选择的发行曲线导出为TFX文件;
6.如何在Maya中使用TressFX Exporter
那么我们已经在Maya 中安装完成了AMD TressFX plugin,那么接下来我就给大家介绍下如何使用AMD TressFX plugin;
大致分为3个步骤:
→使用任意头发梳理工具来制作想要的发型曲线(如Maya Xgen、Zbush…)
→使用AMD TressFX plugin for Unity进行导出
→将导出的TFX文件导入Unity并在Unity中进行渲染调节设置
我们可以使用任意头发梳理工具来制作想要的发型曲线,然后用我们的插件将其转换为TFX文件。
比如可以使用 Maya 的 XGen 工具来制作你的发型曲线,也可以使用Zbush软件制作你的发型曲线(关于如何使用头发梳理工具来制作发型曲线,不是本教程的重点)
→接下来我们可以将上一步骤中所制作的头发的引导线导出为 Maya 的 MEL 文件
→将 MEL 文件重新导入 Maya 场景后,我们可以看到我们创建的引导线会变为一条条蓝色的曲线(如右下角颜色所示)
如右图所示:我们以短发发型为例来给大家讲解下,如何使用TressFX Export Plugin导出头发组;
这里的短发发型引导线主要分为四组制作,分别是Bangs刘海、Top头顶头发、Back头背头发、Flyways碎发;
我们依次导出这四组头发:
→首先我们选中Bangs组 →然后在顶部菜单中找到TressFX菜单,选择TressFX->Export Hair/fur窗口, →然后选择Number of vertices per strand / 每股的顶点数。像这样的短发我们一般选择4或者8,对于长辫子,我一般选择16;
注意:Invert X-axis of Hair 选项默认为启用
我们依次导出这四组头发:
→点击Export! 会弹出对话框,这里我们设置完成文件名Bangs,点击Save后,我们就可以在对于的文件夹下找到这个后缀为.TFX的文件了;
→接下来我们依次导出其他三组头发(将头发组保存为 TFX 文件的步骤与导出Bangs的步骤相同),导完之后就可以在 Unity 中使用它们了;
7.如何在Unity 中创建HairFX Profile文件
这里我们以高清渲染管线HDRP为例:
第一,创建一个HDRP的Unity工程,这里我使用的Unity 版本是Unity 2021.3.4f1c1,并导入我们的角色模型贴图等素材;
第二,创建好工程后,打开该Unity新建项目的文件夹,找到Packages文件夹下的manifest文件,为工程添加HDRP / URP HairFX Shader Package;
第三,打开manifest文件后,将以下内容添加到manifest文件中:
"dependencies": {
"cn.unity.hairfx.core": "https://github.com/Unity-China/cn.unity.hairfx.core.git",
"cn.unity.hairfx.hdrp": "https://github.com/Unity-China/cn.unity.hairfx.hdrp.git",
...
}
如果你的项目是URP工程,则需在manifest文件中添加如下依赖:
"dependencies": {
"cn.unity.hairfx.core": "https://github.com/Unity-China/cn.unity.hairfx.core.git",
"cn.unity.hairfx.urp": "https://github.com/Unity-China/cn.unity.hairfx.urp.git",
...
}
添加完成后,Unity项目会进行重载,重载完成后我们可以在Package Manager 中看到已经加载完成了HariFX包
这里我们以《Defender》资源包为例来给大家进行演示,该资源包包含多种发型供大家尝试;我们可以在Github上免费下载工具和角色资源包(该工程已经添加HDRP / URP HairFX Shader Package)
HDRP版:https://github.com/UnityTechnologies/HDRP-Defender-Character-Demo
URP版:https://github.com/UnityTechnologies/URP-Defender-Character-Demo
第一:添加HDRP / URP HairFX Shader Package之后,接下来我们就可以在Asset 下创建HairFX Profile文件;
第二: Profile创建完成后对其进行重命名;这里我们以短发为例,所以我们重命名为Bob HairFX Profile文件;
8.Unity China HairFX Profile文件的参数介绍
对于一种发型,我们通常将其设置为一个 Unity Hair Profile 文件,每个Unity Hair Profile 文件其中包括全局设置、局部设置模块
设置头发模型和头发模拟两个部分;
我们接下先来观察和了解下这个Unity Hair Profile文件的参数以及含义;
Hair Status:头发的状态统计
Guide Strands 引导线股数;
Guide Vertices 三角面数
Total Strands 总头发的股数
Global Geometry Settings:全局头发股数设置
Hair Count 发丝的数量
Hair Offset 头发偏移(发丝间的距离)
Tessellation Per Strand:每束发丝细分:用于调整发丝柔顺度。低数值能让游戏运行更流畅,高数值能让头发更加柔顺。你可以在优化时寻找最合适的中间点。
Lock Hair Tip 是否锁定发梢
每次修改完成后点击Apply 应用
对于头发模型的整体,我们一般只调整Hair Count(头发数)、Hair Offset(头发偏移)、Tessellation Per Strand(每束发丝细分)及Hair Thickness(头发厚度)(下文介绍这个参数)四项设定。
Global Geometry Settings:头发实体的全局设置
Enable LOD :是否开启LOD
LOD Distance:LOD距离设置
LOD Distance Range :设置LOD的距离
LOD Strand Reduction: LOD 发丝股数减少系数
LOD Hair Width Multiplier: LOD 发丝宽度调节系数
Enable Thin Tip:是否开启发梢变薄
Hair Thickness:发丝厚度
Tip Length:发梢长度的调节
每次修改完成后点击Apply 应用
Global Simulation Settings:发丝全局模拟设置
Location Stiffness:位置刚度
Shape Stiffness:形状刚度
Damping:阻尼调节
Gravity Magnitude:发丝重力大小调节
Tip Separation:发梢分开(蓬松感)
在头发模拟方面,我们通常会保留大部分默认设置。
我们经常调整的是Location Stiffness(位置刚度)、Shape Stiffness(形状刚度)和Damping(阻尼)。
对于松散的头发,我们会将Location Stiffness和Shape Stiffness设为相似的数值,短发数值更大、长发数值更小。
而对于发辫,Location Stiffness数值与散发一致,Shape Stiffness则会被保留为1来保持辫子的形状。
Damping设定了头发随头部动作运动的快慢。对于普通干发,Damping数值一般为0.04~0.06。若想让头发像在水底或衣物那样运动,可以将Damping提高到0.1~0.15。
9.如何使用Unity China HairFX Profile设置头发
以HDRP Demo 为例:
第一,在角色Soldier下创建Hair Styeles空物体;
第二:将角色头部Mesh命名为Bob,并设置为Hair Styeles的子物体;
第三: 选中Bob ,在Inspector面上点击Add Compent 添加 HairFX Groom、HairFX Simulation两个脚本; HairFX Groom相当于HairFX Profile的容器; HairFX Simulation脚本的作用是控制头发物理效果的模拟,比如这里有关于Wind settings 风动设定用于控制Wind Magnitude(风力)和Pulse Magnitude(摆动幅度)的大小;
第四:将之前创建的Bob HairFX Profile,添加到HairFX Profile组件中的Hair Profile中;
Unity Hair Profile 可以连接多个 Unity Hair Assets,也就是我们从Maya导出的 .TFX 文件。如右图所示,我们为Bob Profile的Unity Hair Profile 文件添加 Back、Bangs、Top、Flyways四个Asset资产;如果你还想继续添加其他Asset资产,可以点击“+”号按钮。
我们将头发导出为不同的 TFX 文件的原因是为了我们可以自由地对头发的不同部分进行不同的模型效果的设置和模拟发丝物理效果的设置。
我们可以为头发的各个分组指定不同的材质,但材质的数量必须与头发资产的数量相同。
如右图所示,以Bob 发型为例,我们需要在Inspector>Mesh Renderer>Materials List下添加四个材质分别对应于Bob发型的四个Asset资产 Back、Bangs、Top、Flyways。
这里我们为Bangsl刘海为例为大家演示如何创建头发材质;
1.在Asset下点击Create创建Material,重命名为Asian Cherry;(这里我为刘海设置樱花粉颜色 )
2.材质的Shader 我们设置为Shader Graph>SG_PhysicalHair;
3.修改Hair Color、Root Color、Tip Color的颜色;设置颜色模式为HSV,HSVA值分别设置为350,68,100、100;
4.同样的步骤我们创建Asian Green头发材质;(这里我为头顶头发颜色设置绿色)
接下来我们Bob Gameobject 的Mesh Renderer的材质列表中设置材质;
本示例我分别为Bob的四个Asset资产 Back、Bangs、Top、Flyways设置了Asian Green、Asian Cherry, Asian Green、Asian Cherry材质,从而达到如下效果;
注意这里是四个材质,不是四种材质,当然你也可以添加四种不同材质来表现头发不同部分的不同效果;
我们使用的是HDRP内置的头发着色器。如果你想编写自己的着色器,请一定要按以下参数进行设置:
Graph Settings
● Material : Hair
● Material Type: Physical
● Advanced Options/ Geometry Type: Strands
Master Stacks
● Custom Function node:
○ Name: GetExpandedVertex
○ Source: VertexStrsndGroom (hlsl file)
● Hair Strand Direction: 1,0,0
我们使用的是URP内置的头发着色器。如果你想编写自己的着色器,请一定要按以下参数进行设置:
Graph Settings
● Material : Physical Hair
● Geometry Type: Strands
Master Stacks
● Custom Function node:
○ Name: GetExpandedVertex
○ Source: VertexStrsndGroom (hlsl file)
● Hair Strand Direction: 1,0,0
Copyright2022 Unity中国版权所有。保留所有权利。
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。
AMD TressFX 是2020-2022 AMD 公司,版权所有。保留所有权利。
AMD、AMD 箭头标识、Radeon、锐龙及其组合是 AMD 公司版权有。
本文档中提及的其他名称仅为信息提供目的,也可能是其各自所有者的商标。
特别声明:
本文档内的Unity China HairFX毛发系统解决方案均由Unity中国提供技术支持。
本文档中的信息仅供参考,可能存在技术误差、遗漏和印刷错误。本文档所包含的信息会随时更新,并可能因多种原因而呈现不准确,包括但不限于产品和路线图的更新、部件和主板版本的更新、新型号和/或产品版本发布、不同制造商之间的产品差异、软件更新、基本输入/输出系统(BIOS)刷新、固件升级或其他此类更新。任何计算机系统都存在无法完全预防或缓解的安全漏洞风险。AMD或Unity China均不承担更新、更正或修订此信息的任何义务。但是,AMD和Unity China保留修订此信息和随时更改本文档内容的权利,如有修订或更改,AMD或Unity China不承担任何通知义务。
本文档中的信息按“原样”提供。AMD和Unity China不对本文内容做任何表示或保证,也不对本信息中可能出现的任何误差、错误或遗漏承担任何责任。AMD特别声明,未做任何非侵权、适销性或适用于任何特定用途的暗示保证。在任何情况下,AMD或Unity China均不对任何人因使用本文所含任何信息而导致的任何依赖、直接、间接、特殊或其他随之发生的损害承担责任,即使AMD已被明确告知此类损害的可能性。
页:
[1]