1. 项目概述从写实到风格化的发丝革命最近在做一个二次元风格的角色项目角色那头飘逸的秀发可把我折腾得够呛。传统的材质方案无论是用多层半透明叠加模拟发片还是用复杂的视差遮罩总感觉差了点意思——要么质感塑料要么性能开销巨大风格化效果也难调。直到我把目光投向了UE5那个听起来就很“硬核”的Hair Shading Model。很多人一听到“Hair Shading Model”第一反应就是用来做《黑客帝国觉醒》里那种以假乱真的写实毛发。这没错但它绝不仅限于此。这个着色模型的核心是提供了一套基于物理的、专门为圆柱体发丝优化的光照计算框架。这意味着它天生就懂头发的高光特性比如那标志性的“天使环”次级高光懂如何让发丝在背光时透出漂亮的边缘光也懂如何让发丝的体积感和方向感更自然。那么一个为写实而生的工具怎么用到风格化角色上呢这正是我想分享的核心打破思维定式。我们不是要复刻真实头发的每一根毛鳞片而是要“借用”这套强大的光照响应机制来为我们风格化的、可能只有几片大色块的“发片”或低面数模型注入灵魂。你可以把它想象成给一个简笔画角色用上了大师级的素描光影原理出来的效果既有卡通的味道又有高级的质感。这个项目我将带你一步步拆解如何用UE5的Hair Shading Model为风格化角色制作出既有体积感、光感又独特的发丝。过程中我还会引入一个大家熟悉的参照物——Metahuman的头发作为对比案例。我们会看到即便是追求极致写实的Metahuman其头发制作思路中也有大量值得我们风格化项目借鉴的“底层逻辑”而风格化项目又如何通过参数的大胆调整走出完全不同的视觉路径。无论你是独立开发者、技术美术还是对角色表现有追求的爱好者这套方法都能帮你打开新世界的大门。2. 核心原理Hair Shading Model到底在算什么在动手调参数之前我们必须先搞明白这个着色模型底层在干什么。知其然更要知其所以然这样调起来才不会像无头苍蝇。UE5的Hair Shading Model是基于著名的“Marschner毛发着色模型”的简化与优化实现。别被名字吓到我们把它拆解成几个你能直观感受到的组成部分。2.1 发丝光照的三层贡献想象一束光打在一根头发上它其实会被分成三个部分反射或散射出去Hair Shading Model主要模拟了其中两个对视觉贡献最大的R 反射R Reflection这是最直接的部分就像镜子反射。光线在发丝表面直接弹开形成我们通常所说的主高光Primary Specular。它的颜色主要来自光源本身非常集中、明亮。TT 透射透射Transmission-Transmission这是头发魅力的关键。光线穿透发丝的外层角质层在内部经过一次散射再从另一侧穿出。这个过程会让光线带上头发底色Base Color的信息并且因为散射而变得柔和、弥散。它形成了所谓的次级高光Secondary Specular也就是常说的“天使环”。这个高光通常比主高光更宽、更柔和且带有头发的固有色。至于第三个TRT透射-反射-透射路径虽然真实存在但在实时渲染中为了性能常被简化或合并到其他项中。对于我们风格化制作理解R和TT这两项就完全足够了。2.2 核心输入发束朝向Hair Strand Direction这是Hair Shading Model区别于其他模型最根本的一点。它要求材质知道每一根“发丝”或者说每一个像素所代表的那个微小发丝段的朝向Direction。这个信息通常来自模型的切线Tangent通道。在写实毛发如Metahuman的Groom中发束朝向是由毛发 groom 系统生成的非常精确每根发丝都有自己的方向矢量因此光照计算极其准确。在风格化发片中我们的模型可能就是一个片状网格Card。这时模型的切线方向就至关重要。你必须确保模型的UV展开和切线方向是顺着假想的“发丝流向”的。如果切线方向乱掉高光就会在发片上“乱窜”完全失去逻辑。这也是很多新手踩的第一个坑。2.3 关键参数映射理解了原理我们再来看材质球里那些参数就不再是黑盒了底色Base Color主要影响TT次级高光的颜色。你想让头发在逆光下泛出什么颜色的光晕就在这里设置。粗糙度Roughness控制高光包括R和TT的锐利或模糊程度。粗糙度低高光小而亮像柔顺的秀发粗糙度高高光散而柔和像干燥或染烫过的发质。发色Hair Color一个特殊的参数它更像是一个全局的染色层会与Base Color结合共同决定头发的整体颜色和次级高光的色调。散射Scatter这个参数控制光线在发丝内部的散射强度。增大它会让头发看起来更“透光”尤其是在背光环境下边缘光会更明显、更柔和这对于营造风格化的、发光般的发丝效果非常有用。注意风格化制作中我们常常会“滥用”这些物理参数。比如为了得到更梦幻的边缘光我们可能会把Scatter值调到远超真实范围。这没关系我们的目标是视觉美感而非物理正确。3. 风格化发丝材质实战从模型准备到材质构建理论说得再多不如动手做一遍。我们从一个最简单的风格化发片模型开始。3.1 模型与UV准备打好地基假设我们有一个类似动漫角色刘海的大型发片模型。这一步做不好后面材质再厉害也白搭。模型拓扑确保发片模型有足够的分段特别是沿着发丝方向的长度上。这能让高光沿着发丝方向平滑移动而不是在几个大面上跳跃。切线方向重中之重在DCC工具如Maya、Blender中导出模型时必须确保切线Tangent信息被正确计算并导出。切线应严格沿着发丝从发根指向发梢的方向。在Blender中你可以在编辑模式下查看“面朝向”和“UV朝向”来辅助判断在Maya中确保模型法线、切线信息完好。UV展开UV应尽量保持统一方向避免扭曲。一个简单的技巧是使用“沿边缝合”的展开方式让UV岛的方向与发丝流向一致。这能保证后续我们采样任何沿着发丝方向的纹理如噪波、渐变时不会出现奇怪的拉伸。3.2 创建基础Hair材质函数在UE5的材质编辑器中我们开始构建核心材质函数。设置着色模型在材质根节点将“着色模型Shading Model”从默认的“默认光照Default Lit”改为“毛发Hair”。这是激活所有毛发专用光照计算的前提。连接基础属性将纹理采样或常量颜色连接到底色Base Color。连接一个常量或纹理到粗糙度Roughness。风格化头发通常可以使用一个中等的恒定粗糙度如0.4-0.6来获得一个既不过于尖锐也不过于模糊的高光。连接一个颜色到发色Hair Color。这里可以玩点花样比如用一个从发根到发梢的渐变通过UV的V通道控制来模拟染发或自然的色彩变化。引入发束朝向这是关键一步。从材质编辑器中拉出“VertexNormalWS”和“VertexTangentWS”节点。我们需要一个“Hair Strand Direction”向量。通常可以直接使用“VertexTangentWS”世界空间切线作为发丝方向的近似。对于更精确的控制有时需要结合法线进行叉积计算但对于大多数风格化发片直接使用切线足矣。将这个方向向量连接到材质根节点暴露的“毛发朝向Hair Strand Direction”输入口如果默认没有需要在材质根节点的细节面板中勾选显示。3.3 风格化增强技巧现在我们有了一个物理正确的毛发材质但看起来可能还是太“写实”。接下来就是注入风格化的灵魂。夸张的散射Scatter与边缘光创建一个标量参数命名为“Scatter_Intensity”将其值调高比如到1.5甚至2.0。连接到根节点的“散射Scatter”输入。为了进一步增强背光效果我们可以手动添加一层边缘光。使用“Fresnel”节点将其输出边缘强度乘以一个你喜欢的颜色比如比Base Color更浅、饱和度更高的颜色然后以“Additive”模式叠加到自发光Emissive Color通道上。注意控制强度不要让头发看起来自己在发光除非你想要这种特效。非真实的高光控制写实头发的高光位置和形状由光照方向和发丝方向严格决定。我们可以“作弊”。使用“Hair Lighting”相关的材质函数输出如各高光分量的强度再用一个基于视角或自定义遮罩的节点去调制它。例如可以让头顶的高光总是保持最亮不受实际光照角度影响营造一种卡通化的恒定光泽感。使用渐变纹理丰富底色不要只用一个纯色作为Base Color。使用一张一维的渐变纹理Gradient Texture沿着发丝的UV方向通常是V方向采样。可以设置发根深、发中为主色、发梢稍浅或带有另一种色调。这能立刻增加头发的层次感和体积感。噪波扰动与发丝细节对于想要表现更细腻、略带凌乱感的风格化头发如一些手绘风游戏可以在粗糙度或法线通道上添加微弱的噪波扰动。使用一个平铺的、低对比度的噪波图乘以一个很小的系数如0.1然后加到粗糙度上。这能打破高光过于完美平滑的感觉增加手绘质感。实操心得在调整Scatter和边缘光时务必在动态光照环境下如旋转一个方向光观察效果。一个好的风格化发丝应该在背光时产生漂亮的光晕在顺光时又不至于显得单薄。这需要反复在场景中对比调试。4. Metahuman发丝案例深度对比分析为什么要把Metahuman拉进来对比因为它代表了Epic官方对于“如何用Hair Shading Model制作高质量写实头发”的最佳实践。解剖它我们能学到通用的底层逻辑并看清风格化与写实化的分岔路口在哪里。4.1 Metahuman发丝技术拆解打开一个Metahuman的毛发资产你会发现其复杂程度远超一个简单的材质球。它是一个由Groom 资产、毛发几何体和专用材质组成的系统。几何体发束与引导线Metahuman的头发不是单根建模而是由成千上万的“发束Hair Strands”组成每束头发由一条“引导线Guide Hair”控制形态。这些几何体数据被导入UE5后形成了极其密集且方向信息准确的网格。Groom资产数据的核心Groom资产存储了头发的所有非几何信息每根头发的颜色、粗细、粗糙度、散射系数等这些信息可以沿着发根到发梢变化。它本质上是一个数据容器驱动着几何体上每个顶点的材质参数。材质参数驱动与纹理采样Metahuman的毛发材质同样是Hair Shading Model。它的精妙之处在于参数来源于GroomBase Color, Roughness, Scatter等核心参数并非来自一张统一的纹理而是来自Groom资产中为每根头发定义的数据。这实现了极高程度的差异化比如发根和发梢可以有不同颜色和粗糙度。使用专用纹理它会采样一些特殊的纹理比如ID贴图来区分头皮区域、不同区域的头发属性如刘海、鬓角、后发从而实现区域化的材质控制。复杂的着色器网络包含了针对不同光照环境如室内、室外的微调以及处理头发阴影、半透明深度排序等高级功能的节点。4.2 风格化与写实化的核心差异通过对比我们可以清晰地总结出两种路线的区别特性维度Metahuman (写实化)风格化项目 (我们的方法)几何基础高密度发束几何体每根有精确方向。低面数发片Cards或简单体块依赖模型切线方向。数据来源参数主要来自Groom资产每根头发独立。参数主要来自纹理贴图渐变、噪波和材质常量统一控制一片头发。颜色变化基于发根、发梢的复杂渐变可能包含多种染料层。使用简单的1D或2D渐变纹理色彩对比可能更强烈、更概括。高光控制严格遵守物理R, TT路径高光形状、位置由光照和发向精确计算。可能“作弊”使用自定义遮罩固定或夸张高光区域追求风格化美感而非物理准确。散射与透光散射值基于真实测量追求背光下真实的透光感。大幅提高散射值追求夸张的、发光般的边缘光效果。性能考量极高数万根发丝的光照计算。较低几个到几十个发片网格的计算。目标效果以假乱真融入真人扫描环境。视觉突出强化卡通、动漫、手绘等特定艺术风格。4.3 从Metahuman借鉴什么即使做风格化Metahuman的以下思路也极具价值发根处理观察Metahuman的发根颜色通常更深且与头皮有柔和的过渡。我们在风格化发片的根部纹理上也可以做一个深色渐变并让模型与头皮有轻微的重叠或使用透明渐变来模拟这种过渡避免出现“假发套”似的硬边。区域化控制Metahuman用ID图区分不同头发区域。我们可以简化在UV布局时就将刘海、侧发、后发放在不同的UV岛这样在材质中就可以根据UV位置使用不同的粗糙度或颜色偏移增加细节。动态效果的基础写实头发追求随风飘动的动态。风格化头发虽然动态可能更夸张如卡通式的弹性摆动但其骨骼绑定或物理模拟的基础依然是发丝的方向信息。确保你的发片模型的骨骼链或物理模拟引导方向与材质切线的方向一致动态起来才会自然。5. 性能优化与常见问题排雷用上了高级着色模型也得关心下性能开销和实际制作中那些烦人的小毛病。5.1 性能优化要点Hair Shading Model本身比Default Lit计算量稍大但对于风格化发片来说瓶颈通常不在这里而在draw call和过度绘制上。合批与LOD将多个相邻的、材质相同或相似的发片模型合并成一个网格能有效减少draw call。同时为复杂的发片模型创建LOD细节层次在远距离用更少面数的模型并可以同步简化材质如关闭复杂的噪波计算。谨慎使用透明如果发片需要半透明如一些发梢效果尽量使用蒙版Masked而非半透明Translucent混合模式。半透明渲染顺序依赖排序且无法写入深度极易造成过度绘制和性能下降。用蒙版配合一张有渐变透明通道的纹理是更高效的选择。简化材质逻辑在保证效果的前提下检查材质蓝图。移除不必要的复杂数学运算和纹理采样。对于风格化头发很多时候一个Base Color纹理、一个粗糙度常量、一个高Scatter值就足够了。5.2 常见问题与解决方案实录这里记录了我踩过的一些坑和解决办法希望能帮你节省时间。问题1高光闪烁或断裂不连续。现象旋转视角或灯光时头发上的高光会突然跳动、断裂而不是平滑移动。排查99%的问题出在模型的切线数据上。解决回DCC软件检查模型切线是否统一、连续。在Blender中可以尝试使用“Mesh Normals Split Edges”然后“Mesh Normals Merge by Distance”来清理顶点再重新计算切线。在UE5中导入模型时在导入设置里勾选“计算切线Compute Tangents”并选择“MikkTSpace”算法这是目前兼容性最好的。在材质中尝试将“Hair Strand Direction”从使用“VertexTangentWS”改为使用“World Normal”或自定义计算的方向作为临时调试看问题是否消失以定位问题。问题2头发在特定角度下变黑或消失。现象从侧面或背面看头发部分区域完全变黑或者看起来像被裁剪了。排查可能是背面剔除Backface Culling或双面光照Two Sided Lighting设置问题。解决在材质根节点的细节面板中确保“双面Two Sided”属性被勾选。因为发片很薄我们需要看到正反两面。如果勾选后问题依旧检查模型法线。有时模型法线方向不一致会导致光照计算错误。在DCC软件中统一法线朝向。问题3边缘光效果太弱或不明显。现象即使Scatter值调得很高背光时的透光感依然不强。排查首先确认灯光强度是否足够特别是背光方向的灯光。其次检查是否与其他后期效果冲突。解决增强背光光源的强度。尝试将方向光的强度提高到10以上观察效果。在项目设置中检查“渲染Rendering”下的“毛发Hair”相关选项是否都已启用。手动添加的菲涅尔边缘光效果可以尝试用“Power”节点对菲涅尔因子进行指数级放大让边缘更锐利。例如将Fresnel节点连接到一个Power5的节点上再乘以颜色。问题4与场景其他物体阴影交互怪异。现象头发在脸上或衣服上投下的阴影非常粗糙有锯齿或块状感。排查这是阴影贴图分辨率Shadow Map Resolution和毛发阴影精度的问题。解决选中产生阴影的方向光在细节面板中提高“阴影分辨率Shadow Resolution”。对于更重要的角色特写镜头可以考虑为该方向光启用“接触阴影Contact Shadows”它能提供额外的细节阴影。在毛发材质的“高级Advanced”设置中可以微调“阴影偏移Shadow Bias”等参数但需谨慎容易引入新的阴影失真问题。最后想说的是技术是为艺术表达服务的。Hair Shading Model是一个强大的工具但不要被它的“物理正确”束缚住。在风格化的世界里参数没有对错只有好看与不好看。大胆地去尝试极端的数值把Scatter调到3.0看看是什么效果用完全不真实的颜色作为高光或许就能碰撞出独一无二的视觉风格。多参考优秀的动漫、游戏作品分析他们的头发在光下是如何表现的然后将这种感受用你手中的工具实现出来。这个过程本身就是打破次元壁最有趣的部分。