Choose your operating system:
Windows
macOS
Linux
Epic Games启动程序(Epic Games Launcher) 的 学习 选项卡中下载 数字人类(Digital Humans)
此展示旨在体现高精度角色着色器技术的使用。这些技术与Epic的MOBA游戏Paragon中角色使用的技术相似。秩序打开项目并点击在编辑器中运行(Play In Editor)即可查看动画演示。
如需了解用于制作此角色技术的更多信息,请观看此视频Unreal Engine Livestream - Tech & Techniques Behind Creating the Characters for Paragon。
皮肤着色
角色的皮肤使用UE4的次表面轮廓着色模型。
请注意我们使用了材质函数来设置皮肤材质的基础。它作为一种可重复使用的制作方法,可以用于创建 Paragon 的材质。这样,在了解了对单个函数进行的基础修改将更新此函数使用之处的所有实例后,美术师就可以将特定类型表面的生成方法标准化。
皮肤着色器纹理
用于角色皮肤上的纹理分辨率均为4K,最初由演员面部扫描生成。之后,Epic的美术师清理并调整了这些纹理。此皮肤设置共使用了五种纹理贴图:漫反射(diffuse)、粗糙度(roughness)、高光度(specularity)、散射(scatter)以及法线(normal)。
纹理 |
名称 |
描述 |
---|---|---|
|
漫反射(Diffuse) |
漫反射贴图为材质提供基色。在4K分辨率下,皮肤下的毛细血管均清晰可见。深色的皱纹则能突出法线贴图提供的纹理。(UE4_Demo_Head_D) |
|
粗糙度(Roughness) |
粗糙度贴图保存在漫反射纹理的透明通道中。这个常用技术可将使用中的纹理量保持到最低。注意粗糙度在毛孔和皱纹中会有所增加。这会导致这些区域缺乏光亮度,突出漫反射和法线贴图带来的深度感。此外还需注意头发纹理的粗糙度设为完全粗糙(1.0),防止头皮带来杂散反射高光,并为头发带来更强的深度感。(UE4_Demo_Head_D) |
|
高光度(Specular) |
高光度贴图控制皮肤表面可见的反射高光量。需要注意的是默认反射值为0.5。此贴图将提升皮肤拉伸更紧之处的反射度,并降低不需要反射之处的反射度(如毛孔中心和皱纹之中)。(CH2_exp04_merged_spec_f_FC_FINAL) |
|
散射(Scatter) |
散射贴图控制散射透过皮肤表面的光照量。暗处区域展示出的散射极少(如脸颊),而明亮区域则能感受到更大量的散射(如鼻子和耳朵)。散射颜色则由次表面轮廓资产 进行管理。 (UE4_Demo_Head_BackScatter) |
|
法线(Normal) |
法线贴图常用于常规材质设置,扰乱像素法线为表面提供触觉纹理。其设置在此示例中并无特殊之处。(UE4_Demo_Head__normals) |
头发着色
头发着色由UE4的头发着色器模型处理。此着色器是基于物理的着色模型,以Eugene d'Eon、Steve Marschner和Johannes Hanika的研究为基础。Weta Digital如今正在使用此着色器。着色器通过各向异性反射(anisotropic specularity)近似出头发表面的光反射、穿过头发的折射,以及通过多条发缕的散射。
将材质的 着色模型(Shading Model) 属性设为 头发(Hair) 即可使用UE4头发着色器。
头发和反射
在真实世界中,头发通常有多个镜面反射高光:一个代表光的颜色,另一个则是头发颜色和光颜色的混合。在此文档中,我们将它们称为主要和次要反射高光。头发着色器可近似出高度真实的相同效果。
UE4的头发着色器中使用的近似算法以类似真实世界的方式来创建这些效果。光线照到毛囊表面时不会折射回来。头发为半透明,部分光线能够 穿过 它,并可能在其中四处反射后退出。头发着色器和头发进行交互时通过光线可能行进的三条通道进行近似,如下方的动态GIF图所示:
数字 |
描述 |
---|---|
0. |
毛囊的延展方向(从根到梢)。 |
1. |
仅限反射的通道,光线会在头发表面形成反弹,可以产生主要反射高光。 |
2. |
传播-传播通道,光线通过此通道传入毛囊并从另外一侧退出。这是光线在大量头发中进行散射的方式。 |
3. |
传播-反射-传播通道,光线通过此通道进入毛囊,在表面的边界中反射开,然后退出,可以产生次要反射高光。 |
如上方图表所示,一根头发并非是完美的圆柱体或管道状。事实上,头发的形状更像是一系列堆叠起来的圆锥体。这意味着从头发表面反射开的光线散射与非常光滑的头发所形成的散射有所不同。进一步说,每根头发均指向不同的方向,因此反射高光不会统一,但是会基于头发指向的方向进行独立放置。这通常被称作 各向异性 反射,UE4头发着色器同样支持此特性。
头发和透明
头发着色器使用遮罩混合模式替代半透明。然而,遮罩半透明将生成一个二进制结果——表面为完全不透明或完全透明。噪点仿色图案不断在表面上移动,需要突出实心的区域更为密集。仿色被用作混合遮罩透明的一种方式,但只在TemporalAA启用时生效。
结合TemporalAA使用动态仿色需要数帧来进行混合。头发处于动态时可能出现穿帮。这是该技术的正常负面效果。
边缘遮罩
虽然并非是着色器本身的一部分,但仍然值得一提的是用于示例角色头发、以及Epic游戏 Paragon 中其他角色的材质使用边缘遮罩(Edge Mask)在头发侧对摄像机时将其淡化。由于头发作为一系列的平面进行渲染——参见下方 头发和几何体,因此从一些特定的摄像机角度可能可以看到每个平面的边缘,破坏头发效果。
为减轻此问题,材质在表面垂直旋转离开摄像机时计算摄像机相对于顶点法线的向量,它还将淡出至完全透明。而此方法的另一个方面是执行此操作时头发着色器可能显示更多头皮。这是头发较多的角色的头皮上通常绘有头发纹理的原因,如下图所示。
需要指出的是此效果与Quality Switch节点相关联,因此在低性能平台上它可能很容易被关闭,以换取一些着色器性能。和往常一样,推荐在目标平台上进行测试。
头发创建
使用此示例中的技术创建头发需要理解Epic构建此角色头发的方式。
头发几何体
使用UE4头发着色器的头发几何体通常使用一系列非平面的片表面,这是诸多实时头发解决方案中的一个常见方法。它们可以在你选择的DCC应用中进行制作。
头发几何体细节不存在一成不变的规则,但需要注意的是此角色使用大约800个发片,总共约18000个三角形。还需要注意头发材质在主材质节点的属性中被设为两面。
头发纹理
在UE4头发着色器的本使用实例中,最终结果由五个主要纹理驱动:漫反射(Diffuse)、透明(Alpha)、根(Root)、深度(Depth) 和每缕独立的 ID 纹理。在Epic中,这些纹理通常使用3ds Max的头发系统生成,将模拟的头发结果投射到一块几何体上。然而,相似结果拥有多个可用选项。
纹理 |
名称 |
描述 |
---|---|---|
|
漫反射(Diffuse) |
漫反射纹理提供头发中主要的弥散或 基础 颜色。有时最好不对此纹理进行着色,通过参数驱动其颜色,特别是当角色头发可能染上多种不同颜色时更是如此。(UE4_Demo_Hair_D) |
|
透明(Alpha) |
透明纹理为头发提供不透明区域,隐藏发缕主体外的几何体。(UE4_Demo_Hair_A) |
|
根(Root) |
根纹理提供一个遮罩,用于变更从发根至发梢的颜色,可调亮或变暗头发。(UE4_Demo_Hair_Roots) |
|
深度(Depth) |
深度纹理由像素深度(Pixel Depth)偏移所用,使头发获得深入发卷的特征。它也可用作变更不同深度头发颜色或着色值的基础,如在头发朝头皮方向移动时减少整体反射。(UE4_Demo_Hair_Depth) |
|
Unique ID |
Unique ID纹理为给定头发几何体提供一个独特的0到1之间(黑到白)的值。这可以用于为头发自身提供细微的变化。(UE4_Demo_Hair_ID) |
头发着色器属性
使用头发着色器时,你可以看到主材质节点中有一些新属性可用:散射(Scatter)、切线(Tangent) 和 背光(Backlit)。
在撰写此文档时(版本 4.13),背光(Backlit)属性只作为着色器早期版本的一部分而存在。头发着色器内部不会使用和该属性的连接,因此可以无视该属性。
散射(Scatter)
我们将头发着色器视作 近似 而非 模拟 的其中一个主要原因是事实上我们并没有对每缕单独的发丝进行模拟,也没有完美模拟精确的光照行为。在真实世界中,光线从头发毛囊反射并进行传播时,它会经常遇到 其他 发丝,并连续多次重复相同进程。此时没有计算系统能够准确生成此类实时模拟的效果。
然而,光线散射穿过头发主体的方式仍然决定着头发在游戏中的真实感,即它是否能够与真实世界相似。为进行控制,头发着色器提供了散射(Scatter)属性,替代主着色器节点上的金属感(Metallic),该值限定在0.0和1.0之间。散射(Scatter)控制通过角色头发整个主体(将其视为单个表面)的光线量。
关于散射(Scatter)重要的一点是,它会比浅色头发更亮,比深色头发更暗。它遵循了自然世界的物理规则,因为深色头发将吸收更多光线。在实际操作中,如果尝试创建一个金发角色,不仅需要修改弥散纹理或颜色,还需要增加散射(Scatter)的数值。
切线
切线(Tangent)属性替代了头发着色器上的法线(Normal)属性。切线作为与每缕头发平行运行的向量进行计算,方向指回到发根。切线(Tangent)属性的作用是帮助形成适当的各向异性反射。具体来说,各向异性反射是光线从带微小槽的表面(如拉丝金属)反弹开时出现的效果。
切线(Tangent)属性主要用作向量,控制各向异性高光伸展的方向。
在示例角色的头发着色器中,此向量使用Unique ID纹理,被赋予Z轴中0.3和-0.3之间的一个随机偏移。这将生成一个在圆弧中拥有一个随机方向的向量,有助于提供各向异性反射高光中的变体(如在一束真实头发中拥有的效果)。
切线可以两种方式进行映射:自动映射或流型图。自动映射法要求每个头发片的纹理按发根朝向发梢朝下进行朝向。只要头发较短且头发片不存在弯曲和过度扭曲,便可使用这种方法。示例角色的头发也使用了自动映射法。
切线流型图
另一种方法需要创建流型图。如果角色头发较长且弯曲,需拥有比实际几何体更加卷曲的效果,或头发的单个纹理部分朝向不同方向(并非上文所述的上至下),就可以使用这种方法。流型图代表头发在切线空间中或沿表面移动的方向。照片级角色半身像(Photoreal Character Bust)项目中有一个名为 T_Hair_Flow 的未使用流型图。下方是流型图和反射结果的对比。
使用头发着色器的像素深度偏移
像素深度偏移(PDO)并非头发着色器的特有属性。通俗来说,PDO使像素看起来远离摄像机,沿表面形成一种虚拟的景深感。由于头发由简单的几何体片组成(如下文中 头发和几何体 所述),因此使用PDO能为整个头发带来一种切实的景深感。它还将打破头发几何体面与头皮相交的交叉点,如下图所示。
眼部着色
眼睛通常被称作"心灵的窗户"。观者对人的印象主要来自眼睛,其他方面难以匹及。UE4中的眼睛着色器提供眼睛表面的真实渲染,从美术方面对眼睛的每处生理结构进行把控。
极强的相依性。如果在着色器开发方面缺乏丰富的经验,不 建议使用此着色器从零开始构建眼睛。因此,我们强烈建议用户在创建真实人眼时提取此示例中的眼睛几何体,并使用眼睛材质 原样
PhotorealEyeGeo
眼睛生理结构
从生物学角度剖析眼睛的结构可以帮助你深入了解眼睛的特性。该眼睛设置表示了此处可见的每个部分,所有部分均可使用应用至示例角色眼睛的材质实例中的公开参数进行修改。
以下进行快速讲解:
序号 |
名称 |
描述 |
---|---|---|
1 |
巩膜 |
巩膜也称"眼白"。眼睛的这个区域通常十分湿润,拥有少量的触感纹理。 |
2 |
角膜缘 |
角膜缘是虹膜和巩膜之间深色环状区域。某些眼睛的该部分会比其他眼睛更为突出,从侧面进行观察看时通常会淡化。 |
3 |
虹膜 |
虹膜是眼睛中心周围的色彩环状区域。一个人拥有"绿色"眼睛,指的是虹膜主要是绿色。在真实的人眼中,虹膜是可延展和收缩的肌肉状纤维组织,使光线进入瞳孔,或减少进入瞳孔的光线。还需要注意的是在真实世界中,虹膜实际上是碟状或圆锥状,不会凸出眼睛的其他部分。 |
4 |
瞳孔 |
瞳孔是眼睛中心的黑点。这是一个孔,光线穿过这个孔后才会被视网膜的视杆细胞和视锥细胞捕捉到。 |
5 |
角膜 |
角膜是虹膜之上充满液体的透明圆顶物。 |
眼睛中的折射——过去与现在
眼球充满液体,因此它将对穿过其中的光线产生折射。在真实世界中,当我们从多个角度查看眼睛时能够看到折射。由于我们通过角膜观察虹膜和瞳孔,将会因为折射而产生扭曲。在游戏和电影中解决此问题的传统方法是创建两层单独的眼睛表面:一层提供巩膜、虹膜和瞳孔;另一层位于顶部,提供角膜和眼睛的整体湿润度。这样底层表面透过湿润层观看时就会产生折射。在Epic 男孩和他的风筝(A Boy and His Kite) 技术演示中男孩的眼睛就运用了这种方法。下图显示了两层表面的示意图。
然而,使用全新的眼睛着色器可通过 单层表面 实现更为真实的效果。通过角膜表面的光线折射现在完全在着色器中进行处理,减少对下方几何体的需求。你可以打开 MI_EyeRefractive_Bust 材质实例,调整 Refraction On/Off 属性尝试一下。
眼睛着色器参数
眼睛着色器较为复杂,推荐使用默认,因此我们在此对材质内置的美术效果参数进行解析。以下是可在 MI_EyeRefractive_Bust 材质实例常量中进行调整的眼睛着色器参数。我们还将在所有可能的位置纳入建议的参数范围。
名称 |
描述 |
建议值范围 |
||
---|---|---|---|---|
静态切换参数值 |
||||
使用眼部突出(Use Eye Bulge) |
此属性基于眼球几何体是否使用角膜凸起的物理模型来调整着色器的反射属性。 |
n/a |
||
向量参数值 |
||||
巩膜内部颜色(Sclera inner color) |
这是巩膜与虹膜相交时的颜色。 |
n/a |
||
巩膜外部颜色(Sclera outer color) |
这是巩膜在眼睛外边缘的颜色。 |
n/a |
||
次要环境等量(SecondaryEnvBalance) |
此值控制眼睛表面上可见次要环境的量。 |
0.00 - 0.03 |
||
次要环境旋转轴(SecondaryEnvRotationAxis) |
次要环境是虚拟反射,因此它必须围绕眼睛手动旋转。此属性控制旋转的轴。 |
0.0, 0.0, 1.0 Z轴 |
||
标量参数值 |
||||
深度标尺(Depth Scale) |
此值控制角膜下虹膜反射的深度。 |
1.0-1.4 |
||
扁平法线(Flatten Normal) |
此值控制眼睛法线贴图发生的扁平,主要集中在巩膜。 |
0.9 - 1.1 |
||
折射率(IOR) |
角膜下液体的折射索引。控制发生的折射量。 |
1.336 |
||
虹膜凹度指数(Iris Concavity Power) |
与 虹膜凹度标尺 共用,控制光线通过角膜时在虹膜表面上计算出的光线焦散的形态和量。通常只在实际照亮的场景中可见,难以在材质实例编辑器中显现。 |
0.2 - 0.3 |
||
虹膜凹度标尺(Iris Concavity Scale) |
与 虹膜凹度指数 共用,控制光线通过角膜时在虹膜表面上计算出的光线焦散的形态和量。通常只在实际照亮的场景中可见,难以在材质实例编辑器中显现。 |
0.07 - 0.15 |
||
虹膜UV半径(Iris UV Radius) |
控制眼球上虹膜的整体大小。 |
0.14 - 0.15 |
||
虹膜亮度(Iris Brightness) |
控制虹膜的亮度。 |
基于虹膜的颜色 |
||
虹膜粗糙度 (Iris Roughness) |
此值决定虹膜正上方角膜的亮度。 |
0.0 - 0.1 |
||
角膜缘深色标尺(Limbus Dark Scale) |
控制角膜缘深色环状区的大小。 |
2.0 - 2.15 |
||
角膜缘指数(Limbus Power) |
控制角膜缘区域的整体暗度。过高的数值将使整个角膜缘区域变暗。 |
15.0 - 22.0 |
||
Limbus UV Width Color |
控制角膜缘的采样大小,或用于显示角膜缘所分配的眼睛表面的量。该设置十分精细,调整时需小心。 |
0.025 - 0.040 |
||
角膜缘UV宽度着色(Limbus UV Width Shading) |
控制光线对角膜缘着色影响的程度。该设置十分精细,调整时需小心。 |
0.040 - 0.050 |
||
法线UV标尺(Normal UV Scale) |
控制眼睛表面上法线贴图纹理的大小。 |
1.8 - 2.6 |
||
瞳孔标尺(Pupil Scale) |
控制瞳孔的大小。该设置可用于扩大眼睛。 |
0.5 - 1.0 |
||
折射开/关(Refraction On/Off) |
在着色器的折射和非折射版本之间进行混合。 |
1.0 |
||
围绕中心缩放(Scale By Center) |
从中心调整整个虹膜/瞳孔区域的大小。 |
0.8 - 1.2 |
||
巩膜亮度(Sclera Brightness) |
控制巩膜或眼白的明亮度。 |
0.9 - 1.3 |
||
巩膜粗糙度(Sclera Roughness) |
控制巩膜的材质粗糙度数值 |
0.0 - 0.1 |
||
次要环境旋转(Secondary Env Rotation) |
此项沿着使用SecondaryEnvRotationAxis属性所定义的轴旋转次要环境立方体贴图。 |
n/a |
||
阴影硬度(Shadow Hardness) |
控制巩膜内外颜色之间混合的锐度。使用阴影半径(Shadow Radius)驱动巩膜表面的着色,近似出眼睑在眼球表面投射下表面散射阴影的效果。 |
0.1 - 0.2 |
||
阴影半径(Shadow Radius) |
控制巩膜内外颜色之间混合的大小。结合阴影硬度使用。 |
0.5 - 0.85 |
||
高光度虹膜(Specularity Iris) |
控制角膜上(虹膜和瞳孔)的反射等级。 |
0.25 - 0.8 |
||
高光度巩膜(Specularity Sclera) |
控制巩膜上的反射等级。 |
0.25 - 0.8 |
||
静脉(Veins) |
控制由Sclera Color Map提供的眼睛静脉的可见度。 |
基于 Sclera Color Map 和所需的静脉量。 |
||
纹理参数值 |
||||
虹膜颜色(Iris Color) |
请参阅下文的眼部纹理。 |
n/a |
||
法线贴图(Normal Map) |
请参阅下文的眼部纹理。 |
n/a |
||
巩膜颜色(Sclera Color) |
请参阅下文的眼部纹理。 |
n/a |
||
次要环境(Secondary Env) |
这是用作次要反射环境的立方体贴图。请参阅下文的眼睛着色器次要环境。 |
n/a |
眼睛着色器次要环境
次要环境是眼睛着色器的一部分,为眼睛表面提供虚拟的反射贴图。你可以使用着色器中的SecondaryEnv ParamCube为其提供一个纹理,然后使用其他SecondaryEnv属性进行控制。在眼睛的近距离特写中十分实用,可观察到特定的反射,如直接环境、另一个角色等。
眼睛制作
之前在此章节中我们已经提到眼睛着色器代码、材质设置和眼睛网格体几何体之间有极强的相依性。以下高级总览将说明眼睛设置为何如此特殊,这些内容有助于将几何体替换为自建的角色眼睛模型。
自建眼睛时,我们 强烈 推荐使用此示例中的实际眼睛几何体和材质。此处提供的大多数信息均建立在已使用示例中资产的假设之上。
PhotorealEyeGeo
形态和 UV 布局
和真实的人眼一样,眼睛网格体模型并非完美的球体。它前方有一个特殊的圆顶,代表角膜。因此眼睛的形状类似于鸡蛋。
眼睛的UV布局十分重要,因为每个眼睛纹理的比例正是基于它而生成。好消息是,和眼睛着色器完美匹配的UV布局相对简单:沿眼睛前方向轴的平面投射。包含背面并非十分重要(因为它们在眼睛后面),在示例角色上也是这样的情况。
UV布局外观如下:
眼睛纹理
为眼睛创建的诸多纹理将基于以上创建的UV布局,虹膜贴图除外。主要可编辑纹理列表中包含:
纹理 |
名称 |
描述 |
---|---|---|
|
巩膜贴图(Sclera Map) |
巩膜贴图控制眼白颜色以及眼睛边缘展示的静脉和组织颜色。举例而言,如果需要角色的眼睛布满血丝,便需要修改该纹理。(UE4_Demo_Eye_Sclera_Color) |
|
中平面置换贴图(Mid Plane Displacement Map) |
中平面置换贴图用于锁定穿透眼睛中心的平面,并用作虹膜深度偏移的基础。(EyeMidPlaneDisplacement_Example) |
|
法线贴图(Normal Map) |
法线贴图的作用与所有着色器中法线贴图的作用相同——提供触觉纹理变化。在示例角色的眼睛设置中,它沿眼睛的湿润表面生成小块。(T_Eye_Wet_Normal) |
|
切线贴图(Tangent Map) |
切线贴图用于控制表面在切线空间中流动的方向。在示例角色的眼睛设置中,它用于突出角膜与巩膜相交方向的变化。(EYE_NORMALS.EYE_NORMALS) |
|
虹膜贴图(Iris Map) |
虹膜纹理较为独特,它不匹配UV布局。相反,纹理将填充整个分辨率。UV和透明遮罩用于控制整体的虹膜大小以及瞳孔的大小。如需自建虹膜贴图,需要使瞳孔大小接近所提供纹理的比例。(UE4_Demo_Eye_Iris) |
不 直接插入法线贴图(Normal Map)输入。它连接到一个 切线输出(Tangent Output) 节点(必须单独创建),如主材质 M_HairSheet_Master2
眼睛环境遮挡
示例角色眼睛设置的最后一部分是使用一层半透明辅助表面模拟眼睛周围的环境遮挡。在真实世界中,眼睛和其他组织(如眼睑或泪管)接触时将出现十分柔和的阴影。柔和的原因是眼睛自身为半透明,光线将散射通过眼睛。为对此进行真实模拟,我们已放置一个几何体片覆盖眼睛并提供近似的环境遮挡,创建出更加真实的眼睛效果。
应用到这个片的材质名为 MI_Eye_Occlusion_Bust,可在示例角色模型的元素3(Element 3)中找到。
如要为角色眼睛自建内容,则很可能需要自行构建这块几何体。注意:它需要填充睁开眼睑的区域,其UV应清楚地填充3D建模程序中0到1的UV空间。
特别鸣谢
特此感谢Eugene d'Eon、Steve Marschner 和 Johannes Hanika 发布他们的作品 The importance of sampling for physically-based hair fiber models。UE4头发着色器的部分工作正是基于他们的作品而成。