
做次世代角色头发这块我总觉得是最后一道坎。模型精度再高皮肤PBR再真实头发一糊整个角色就垮了。早些年我做游戏角色头发不是用XGen一簇簇刷出来的就是在SP里硬画贴图贴到一个大壳子上怎么看都像戴了顶假发。后来把XGen的引导线梳理和SP的发片材质烘焙串成一条线才算真正解决“又短又假”这个老大难问题。这套工作流适合谁主要做游戏实机角色、CG角色、虚拟偶像、还有动画电影里的次世代资产的人。核心思路就是用XGen把发型梳理成可编辑的引导线再把引导线换成一套带Alpha、Height、Flow Map的头发面片贴图在SP里完成毛发质感最后在Maya或引擎里组合出真实、可控、还能跑得动的发片头发。下面我把整条管线从头到尾拆开讲包括每一步为什么这么做、参数怎么取、以及我踩过的坑。1. 先把思路捋顺这套发片工作流到底在解决什么1.1 发片不是偷懒是次世代角色性价比最高的头发方案很多新人一听到发片Hair Cards就觉得是低模时代的旧办法认为次世代就该用XGen刷几千条曲线直接渲染或者用引擎的Groom系统做实时毛发。这话对一半。影视级离线渲染确实可以走全曲线但游戏实机、交互型数字人、甚至动画片里的角色资产几乎都绕不开发片。原因很简单全曲线毛发的数量一上来内存和DrawCall就爆炸而发片用有限的面片加半透明贴图就能在视觉和性能之间找到最好的平衡点。发片的本质是“用贴图模拟一缕头发”。一个长条面片贴上一张画好发丝纹理的图Alpha通道控制哪些像素透出来就成了一绺头发。几十个这样的面片按发型层次叠在一起就是一顶能看的头发。SP在这条线里的角色不只是画图它真正厉害的地方是能把XGen曲线提供的高模信息转化成一套可复用的PBR贴图相当于把“虚拟假发”烤成了一套流水线材质。1.2 为什么不直接用XGen渲出来也不用Houdini一条路走到黑直接回答XGen做造型确实强尤其Groom工具刷发型很顺手但它生成的无数条曲线在引擎里没法直接用。要么转成Strand资源走Hair Renderer要么手工转网格数量一大就失控。走发片就简单得多——引导线只用来定造型和流向最终渲染的是几十张面片性能压力小一个数量级。Houdini的Groom也很强胜在程序化生成和批量处理适合量产大量NPC和群演头发。但对单个主角或者动作连贯载具的角色来说学习成本和工程复杂度偏高而且Houdini做出来的引导数据进了Maya还要再走一遍烘焙。相比之下XGen SP这套组合XGen负责造型可控SP负责材质统一面片负责运行性能刚好把三个最关键的诉求都拿住了。方案优势短板适合场景XGen SP发片造型可控、材质统一、引擎友好手工梳理耗时、发片层数要手调次世代游戏角色、CG角色Houdini Groom程序化强、批量处理学习曲线陡、单资产效率低多角色量产、影视级群演Yeti节点化、集成Maya好授权成本高、游戏端要转写影视渲染为主纯手动面片SP最可控、资源最省效率低、发丝过渡容易生硬卡通风格、低模手绘角色我个人经验是管线选择一定要看交付目标别盲目追新。如果你是做单角色XGenSP就是最优解如果是一个月要产出三十个路人甲那还是老老实实学程序化。2. 第一步是地基XGen里的引导线不是乱刷的2.1 Description、Guides、Primitive先把名词对齐XGen这套系统里最核心的三个概念是Description描述、Guides引导线和Primitive生成体。Description可以理解成一个“发型方案”里面包含了这套头发的引导线、修改器、密度、长度、形态等所有参数。每个Description对应你模型上一个区域比如头顶区、刘海区、两鬓区可以分别建多个Description来组合成完整发型。Guides是用户手动梳理的关键曲线就像做真人假发时先插好的几根定位针。XGen并不需要你像种田一样把头发一根根刷满而是梳好少量引导线然后通过修改器插值生成成千上万根发丝。Primitive是这些发丝最终生成的形态可以是Spline曲线、Geometry几何体、Card面片或Ribbon带状体。次世代发片流程里我们最后要的是曲线数据所以Primitive以Spline为主导出后再转成面片或者烘焙代理。2.2 梳理引导线的实操要点从整体到局部也不能乱梳理引导线是整套流程里最耗时间的环节也是决定发型成败的一步。我的习惯是把操作顺序固定成四步先摆大形、再顺发流、再调体积、最后处理细节。不要上来就抠刘海和鬓角那样很容易整体失衡等发现头型不对又要重新刷。第一步用Move工具把引导线的大致走向刷出来确定头发从哪个区域分缝、往哪个方向垂落。第二步用Smooth工具顺着发流捋一遍把交叉和生硬转折修平。第三步用Puff和Scale类的笔刷控制整体蓬松度让头发不贴头皮。第四步再用Cut、Noise这些细节工具打理发梢该剪的剪该打散的打散。Modifiers里最常用的几个Clumping成束用来模拟洗发后自然缀合的发束感Clump density大致在20%-50%Clump scale在0.1-0.4比较自然Coil用来做卷发幅度0.05-0.2、频率3-8就能出明显但不夸张的卷度Cut负责精修长度Noise负责打散边缘让发丝不死板。注意引导线别刷太密。很多新手一上手就刷几百根结果电脑卡死不说后续调整也极其痛苦。稀疏引导线配合合理的生成密度才是XGen的正确姿势。2.3 导出曲线下游SP要的不是描述是曲线数据梳理完引导线下一步就是把XGen的数据导出成SP能识别的资产。SP本身不认XGen的描述也不认纯粹的XGen Groom节点它认的是Mesh和曲线生成的Mesh代理。所以我们要先把描述里的引导线或生成曲线导出来。在Maya中选中描述后可以在XGen菜单里导出Curves或者Alembic Cache。如果只是为了给发片定流向导出Guides就够用如果要做精细的发丝纹理烘焙最好把生成密度调高后再导出Generated Hairs。这里有个取舍生成曲线越多后面SP烘焙代理网格越精细但烘焙时间也越长。我的经验是一个发型区域导出两三千条曲线做烘焙源足够再多就是浪费时间。导出后这些曲线会变成Alembic或Maya曲线节点。再到SP烘焙环节我们需要把这些曲线转成细圆柱体网格作为高模代理这一步可以用Maya的Groom转Poly工具也可以用第三方脚本。总之先想清楚下游要什么再决定上游导什么这条主线不能乱。3. 进SP烘焙发片贴图不是画的是烤出来的3.1 从曲线到烘焙代理SP认的是Mesh不是线很多朋友问为什么不能直接在SP里选曲线烘焙因为SP的烘焙器本质上是在高低模Mesh之间投射信息线性数据没有体积它不知道该往哪投射。所以我们必须先把上一步导出的曲线转成Mesh代理——通常是用短小的圆柱体沿着每条曲线生成一截有厚度的几何体模拟一根真实的发丝。在Maya里可以用XGen自带的Convert to Poly功能把一条条曲线转成三角面片或细圆柱也可以写个简单脚本对每条曲线放一个圆环截面沿路径挤出。转完之后检查一下这个“高模发丝群”的方向确保圆柱的走向和头皮模型大概贴合不然烘焙投射时很容易错位、漏烘导致贴图上出现大片黑斑。这套高模代理只用于SP烘焙不进引擎所以不需要太在意布线。重点是密度均匀别出现某一块区域浓密、另一块稀稀拉拉的情况。密度不均烘出来的AO和Height会有一块深一块浅的问题后期非常难修。3.2 发片面板UV规划能省则省别浪费U轴发片的面片Mesh通常分三层外层主要发丝、中层补充过渡、内层贴头皮。每层由若干长条形面片组成这些面片在SP里共用一张纹理集。UV规划上是关键每个面片尽量占一个独立的、不与别人重叠的UV小矩形朝向要一致这样烘焙出来的法线和流向信息才干净。建议把UV区域按面片顺序整齐排列像码砖一样从左上角铺到右下角别东一块西一块。Padding间距至少留8-16像素防止烘出来的AO和Height在贴图边缘互相污染。很多新手烘焙完发现整张贴图花成一团一查UV全是重叠的花半小时全白搭。尺寸选择上一块2048x2048的纹理放20-30个发片面片比较合适超过40个建议拆成两张纹理集或者切成4096。不要贪一张贴图塞满不然单个面片实际分到的像素太少发丝细节全糊掉了。3.3 烘焙通道逐个抠BaseColor、Alpha、Height、AO、Flow Map进SP后新建项目Mesh选发片低模随后在烘焙设置里选高模代理。重点说几个关键参数Output Size按面片数量选2048或4096Max Distance一般设5-10厘米能让高模发丝的AO和高度信息正确投影到低模面片上勾选Use Low Displacement可以保留更多高低模之间的起伏关系。烘焙的通道不是一个一个随便点的基本组合是这五个贴图通道作用来源/生成方式关键参数BaseColor / Diffuse头发基础颜色渐变高模底色 手绘修正根部深、发梢浅明度差控制在10%-20%Alpha发丝轮廓与透明度从高模AO/Curvature提取阈值建议192/255以上抗锯齿边缘Height厚度视差从高模高度信息烘焙幅度0.05-0.15太强容易脏AO发丝之间阴影从高模烘焙让发丝有分层感不是一片白板Flow Map发流方向向量用Gradient按曲线方向生成R通道主方向G辅助B存卷曲或AOAO和Height是“发丝感”的来源Alpha是“透空感”的来源Flow Map则是让头发在光照下顺着方向变化的灵魂。在SP里烘焙完AO和Height之后再用画笔在BaseColor上叠渐变——发根颜色深发梢颜色浅中间适当加一点环境色偏移这样头发才不死黑。3.4 材质模板与图层堆叠SP的Hair模板可以直接用但必须做三处修改第一Opacity输出接到Alpha测试或半透明通道阈值大概在0.5第二材质开双面渲染否则背面透不出来第三关闭深度写入避免发片层之间互相遮挡导致排序闪烁。图层堆叠我通常这样做底层一个纯色渐变设定基调中间一层用AO转换的纹理叠加做发丝纹路再上层用画笔加高光区域最后用蒙版控制发梢透空。高光不是一条白线从头拉到尾而是靠近发根比较弱、发中到发梢逐渐增强再把Flow Map连到高光节点上光源移动时高光会顺着流向滑动这个细节直接决定头发“活不活”。4. 发片回Maya和引擎把贴图穿到角色头上4.1 沿引导线摆发片的三种姿势贴图做完接下来是让面片在头皮上落位。三种常用做法第一种手动摆放。把面片Mesh复制几十份手动旋转对齐到头皮表面再用画笔或晶格变形微调。好处是每个面片的位置都可控适合卡牌级或者特写镜头不多的角色。缺点就是慢一顶头发布几十张面片摆一下午是常有的事。第二种用XGen的Card或Ribbon直接生成面片。回到Maya在Description设置里把Primitive类型改成Card调好高度和宽度XGen会沿引导线生成一批小面片。然后把它们转成Polygons套上SP烘焙的贴图一套头发就有了雏形。这种方式能保留引导线的自然分布比手动摆放快很多。第三种用脚本或插件沿曲线批量实例化面片。例如在Maya里写一个简单的PyMel或Python脚本读取引导线曲线作为路径每个采样点放一片面片并自动对准曲线切线方向。适合一整套量产但批量生成的头发容易太均匀缺少手工梳理的层次感需要在生成后手动挑几片旋转、偏移一下。经验值参考外层发片长9-13厘米宽0.5-1.2厘米内层更短更厚。三层叠加、密度交错基本能做出“野生但有序”的头发质感。4.2 材质与渲染检查清单材质连接上BaseColor接AlbedoRoughness在0.4-0.7之间不要拉到0不然头发会像打了蜡Opacity接Alpha法线贴图如果烘焙了就接上没有烘焙就用法线编辑工具写一个简单扰动让表面不平整。有视差能力的渲染器可以把Height接到Parallax Offset但没有也别强求AO就够用了。检查清单我每次导出前都会过一遍头皮会不会漏出来发缝会不会平直得像刀切刘海贴不贴脸后脑勺的层次够不够厚灯光侧逆光扫过来发梢是不是有半透的亮边这些问题都不是贴图分辨率能救的而是面片密度和层数决定的。5. 踩坑实录做完十几套头发后我想告诉你的5.1 高频问题速查表做发片头发真正上手以后会遇到一堆莫名其妙的问题很多是参数和流程顺序造成的并不是软件bug。我把高频问题列成了一张表照着排查比瞎调强。症状原因解决办法头发像塑料片层数太少、Height和AO太弱补内层发片AO贴图调深Height加到0.15发缝明显面片分布不均中间没补层检查发缝区域手动补几片覆盖Alpha白边边缘没处理干净或Mipmap锯齿阈值调高贴图分辨率提一档烘焙大面积黑UV padding太小、Max Distance太大Padding调到16pxMax Distance缩到5cmXGen生成乱飞引导线交叉严重回到引导线做Smooth别直接在生成层补曲线导入SP没反应没有转成Mesh代理曲线转Polygons或细圆柱后再导入5.2 我的三个经验第一永远先做小块测试。正式给角色做完整头发前先在头顶一小块区域跑通全流程XGen刷、导出曲线、SP烘焙、面片落位、引擎看效果。确认贴图尺寸、Alpha阈值、面片密度都合适再放大到全头。直接全量做翻车一次是真的会心态崩溃。第二发片数量要克制。再逼真的发片一张面片也是一次绘制调用。整头发片控制在80-120张是比较合理的范围再多就要考虑LOD、减少材质尺寸或者用更少的层数。做游戏项目时优化永远是先于效果考虑的事情。第三Flow Map和视差贴图带来的“假立体感”有限。发片能骗过眼睛靠的是层数堆叠和真实Alpha剪影不是一张视差贴图能救回来的。如果你觉得头发薄、平、假先别纠结贴图回去加层数。这个道理我是在项目里拿血泪换来的。最后再分享一个小技巧发片贴图的Alpha不要做成纯白纯黑的两极化边缘保留一小段半透的过渡区头发边缘会更柔和。很多引擎的Alpha Clip会把半透像素直接切掉但你可以在SP里生成一个额外的Soft Mask接到Opacity的偏灰区域这样近看有发丝轮廓远看有厚度感效果比我之前一刀切的Alpha自然得多。