1. 这套CG角色方案到底在解决什么问题
第一次看到这个作品标题的时候,我脑子里冒出来的第一个念头不是"好看",而是"这得烧多少机器"。日本那边做CG角色的大神确实多,但能把UE和Blender串起来做皮肤渲染的,往往不是单纯炫技,而是在解决一个非常具体的老大难问题:实时引擎里的人物皮肤,怎么才能不像塑料。
传统流程里,做角色皮肤有两条路。一条是纯离线渲染,比如用Arnold、Redshift这类渲染器,皮肤质感确实能做得非常细腻,次表面散射、多层高光、毛孔细节都能堆上去,但代价是渲染一帧可能要几分钟甚至几十分钟,做动画基本靠农场。另一条是纯实时引擎,比如UE,速度快、能交互,但皮肤往往偏"蜡像感",尤其是高光过渡和次表面散射的层次,很容易露馅。
这套方案的核心思路,就是把Blender当作高精度的资产加工厂,把UE当作实时呈现和最终合成的舞台。Blender负责雕刻、拓扑、UV、贴图烘焙、毛发梳理这些"慢工出细活"的部分,UE负责材质重建、光照、后期和实时预览。两边各干各擅长的事,最后在UE里合成一个既能实时跑、又接近离线质感的角色。
适合看这套内容的人,我大致分三类。第一类是刚入行做角色美术的,想搞清楚皮肤渲染到底有哪些坑;第二类是已经在用UE做项目、但角色皮肤总是差一口气的从业者;第三类是对Blender和UE联动流程感兴趣、想搭一套自己工作流的技术美术。如果你只是想知道"哪个软件更强",那这套内容可能不太对你的胃口,因为它讲的是配合,不是单挑。
关键词里出现的UE、Blender、皮肤渲染、CG,其实已经把这套方案的四根柱子点出来了。UE是实时引擎和最终呈现层,Blender是资产制作和细节加工层,皮肤渲染是核心技术难点,CG是整体所属的行业范畴。接下来我会按实际制作顺序,把这套流程拆开讲,包括每一步为什么这么做、参数大概怎么定、哪些地方最容易翻车。
2. 整体流程设计与软件分工逻辑
2.1 为什么不是"一个软件干到底"
很多人会问,既然UE现在也能做雕刻、也能做材质,为什么还要绕一圈Blender?反过来,Blender的Eevee也能实时预览,为什么还要进UE?
这个问题的答案,藏在两个软件的设计哲学里。Blender的强项在于资产创作的精细度和灵活性。它的雕刻模式、毛发系统、UV编辑、节点材质,都是为"从零做一个东西"准备的。尤其是皮肤这种需要大量微表面细节的资产,Blender的纹理绘制和烘焙流程非常成熟,你可以很方便地把毛孔、细纹、油脂分布这些信息烘到贴图上。
UE的强项则是实时渲染的稳定性和光照系统。它的Lumen、Nanite、虚拟阴影贴图这套组合,能在实时状态下给出接近离线渲染的光影效果。而且UE的材质编辑器对次表面散射、各向异性高光这些皮肤关键特性的支持,经过几个版本的迭代已经相当可用。
所以分工逻辑很清楚:Blender做"形"和"纹",UE做"光"和"感"。形是模型、拓扑、UV,纹是颜色、粗糙度、法线、次表面这些贴图,光是场景光照和环境,感是最终材质在实时下的表现。两边通过FBX或者USD这类中间格式交换资产,贴图则走PNG或EXR。
注意:不要试图在一个软件里把所有事做完。我见过太多人非要在UE里硬雕模型,或者在Blender里硬调实时光照,最后两边都不讨好。工具分工是效率的前提。
2.2 资产在两边流转的关键节点
整个流程里,资产会在Blender和UE之间来回走几趟,每一趟都有明确的交付物。我把它整理成下面这个表,方便你对照自己的项目。
| 阶段 | 在Blender完成 | 交付给UE的内容 | 注意事项 |
|---|---|---|---|
| 基础模型 | 中低模拓扑、UV展开 | FBX模型 | UV要留足贴图空间,接缝避开面部高光区 |
| 高模细节 | 雕刻毛孔、细纹 | 烘焙用的高模 | 雕刻深度要克制,过深烘焙后会显脏 |
| 贴图烘焙 | 法线、AO、曲率、厚度 | PNG/EXR贴图 | 厚度图对次表面散射至关重要 |
| 毛发制作 | 毛发梳理、发片 | 发片模型或毛发卡片 | UE对发片支持更好,毛发卡片需转成几何 |
| 材质重建 | 基础材质节点 | 材质参数参考 | UE里要重新连节点,不能直接搬 |
| 最终合成 | 无 | 在UE完成 | 后期调色在UE里做,别回Blender |
这张表里最关键的一行是"厚度图"。很多人做皮肤只烘法线和AO,结果进UE之后次表面散射怎么调都不对,原因就是缺少厚度信息。厚度图记录的是模型各部位到表面的距离,UE的次表面散射材质需要它来控制光线穿透的深度。耳朵、鼻翼、手指这些薄的地方透光强,脸颊、额头这些厚的地方透光弱,全靠厚度图来区分。
2.3 皮肤渲染的核心难点在哪里
皮肤渲染之所以难,是因为真实皮肤不是一个简单的表面,而是多层结构。最外面是油脂层,负责高光的锐利度;中间是表皮层,负责颜色;最里面是真皮层,负责次表面散射的暖色调。这三层的光学行为完全不同,用单一材质很难同时表现好。
在UE里,通常用**次表面散射(Subsurface Scattering)或者次表面轮廓(Subsurface Profile)**来模拟。前者性能好但精度低,后者精度高但开销大。做特写角色的时候,我一般用Subsurface Profile,配合厚度图和曲率图来控制散射范围。做全身远景角色的时候,用普通的SSS就够了,省性能。
另一个难点是高光的层次。真实皮肤的高光不是一层,而是油脂层的高光叠加表皮层的漫反射。UE的材质里可以用两个高光节点来模拟,一个锐利、一个柔和,通过粗糙度贴图来区分区域。额头、鼻尖这些油脂多的地方高光锐利,脸颊、下巴这些地方高光柔和。
还有一个容易被忽略的点是颜色空间。Blender和UE对贴图的颜色空间处理不一样,法线贴图、粗糙度贴图这些数据贴图必须用Non-Color空间,颜色贴图用sRGB。如果搞混了,进UE之后要么颜色发灰,要么法线方向错乱。这个坑我踩过不止一次,排查起来非常费时间。
3. Blender端的核心细节与实操要点
3.1 模型拓扑与UV的取舍
做皮肤渲染,模型拓扑的重要性怎么强调都不过分。因为皮肤的高光会沿着拓扑走,如果布线不合理,高光就会扭曲,看起来像塑料。面部布线要尽量沿着肌肉走向,眼轮匝肌、口轮匝肌这些环形肌肉,布线也要跟着环。鼻翼、嘴角这些地方要留足够的环线,方便做表情变形。
面数方面,做特写角色的话,面部单独做到5万到8万面是比较舒服的区间。太低的话,雕刻细节烘不出来;太高的话,UE里跑起来吃力,而且没必要,因为大部分细节是靠法线贴图表现的。身体部分可以低一些,2万到3万面足够,因为身体皮肤的高光变化没有面部那么剧烈。
UV展开有几个原则。第一,接缝要藏在不容易看到的地方,比如耳后、发际线、下巴底下。第二,面部UV要尽量拉直,减少拉伸,否则贴图烘出来会变形。第三,给厚度图留出独立的UV空间,因为厚度图的分辨率要求不高,可以单独排布,不用和颜色贴图挤在一起。
实操心得:UV展开完之后,我会在Blender里用一个棋盘格贴图检查拉伸,重点看鼻翼、眼角、嘴唇这些地方。如果棋盘格变形严重,就回去调整UV。这一步花十分钟,能省后面几小时的返工。
3.2 高模雕刻与细节烘焙
高模雕刻是皮肤质感的来源。毛孔、细纹、油脂分布,这些都要在高模上做出来。但这里有个度的问题:雕刻得太深,烘焙到法线贴图后会显得很脏;雕刻得太浅,又表现不出来。
我的经验是,毛孔的深度控制在0.1到0.3毫米之间,细纹的深度在0.2到0.5毫米之间。这个尺度在Blender里不好直接感知,可以放一个参考物体在旁边对比。比如放一个标准的人头模型,或者放一把尺子,帮助判断深度。
雕刻的时候,不要用均匀的笔刷铺满整个脸。真实皮肤的毛孔分布是不均匀的,T区密集、脸颊稀疏,而且毛孔方向也有讲究,鼻翼两侧的毛孔是斜向的,额头的毛孔是纵向的。用带方向性的笔刷,配合不同的笔刷大小和强度,才能做出自然的效果。
烘焙的时候,法线贴图、AO贴图、曲率贴图、厚度贴图这四张是基础。法线贴图记录表面凹凸,AO贴图记录环境遮蔽,曲率贴图记录凸起和凹陷,厚度贴图记录模型厚度。这四张配合使用,才能在UE里重建出完整的皮肤质感。
烘焙参数方面,采样数给到128以上,分辨率给到4K,边缘扩展给到16像素。这些参数看起来是常识,但很多人为了省时间把采样数降到32,结果烘出来的法线贴图有噪点,进UE之后高光一闪一闪的,非常难看。
3.3 毛发与睫毛的处理方式
毛发是角色真实感的重要来源,但也是性能杀手。Blender的毛发系统很强大,可以梳理出非常自然的毛发,但直接导进UE会变成海量的面片,性能扛不住。
我的做法是在Blender里梳理毛发,然后转成发片。具体来说,用毛发系统梳理出满意的形状,然后用"毛发转网格"功能把毛发转成几何体,再手动优化面数,把发片合并、减面,最后导出成FBX。这样既保留了毛发的自然感,又控制了面数。
睫毛的处理类似,但更精细。睫毛通常用发片做,每根睫毛一个面片,贴图用带透明通道的PNG。睫毛的透明通道要用Alpha Test而不是Alpha Blend,因为Alpha Blend会有排序问题,睫毛会闪烁。
注意:发片的透明通道边缘容易有白边,这是因为贴图的RGB通道在透明区域还有颜色信息。解决办法是在贴图里把透明区域的RGB填成黑色,或者在UE材质里用Alpha通道乘以颜色,把透明区域压黑。
3.4 贴图导出与格式选择
贴图导出的时候,格式选择很关键。颜色贴图用PNG,8位就够,因为颜色信息不需要太高的精度。法线贴图、粗糙度贴图、厚度贴图这些数据贴图,用PNG也可以,但如果要更高的精度,可以用EXR,16位或32位浮点。
不过EXR在UE里的支持不如PNG好,而且文件体积大很多。我的建议是,颜色贴图和法线贴图用PNG,厚度图和曲率图用EXR。厚度图和曲率图对精度要求高,EXR能保留更多细节,而且这两张贴图的分辨率可以低一些,2K就够,文件体积不会太大。
导出路径要统一,最好在Blender里就建好文件夹结构,比如Textures/CharacterName/下面分Color、Normal、Roughness、Thickness这些子文件夹。这样进UE之后导入贴图的时候,不会乱成一团。
4. UE端的材质重建与光照配置
4.1 皮肤材质节点的搭建逻辑
UE的材质编辑器里,皮肤材质的核心是次表面散射节点。这个节点有两个输入:一个是基础颜色,一个是次表面颜色。基础颜色控制皮肤的整体色调,次表面颜色控制光线穿透皮肤后的颜色,通常是偏红的暖色调。
搭建的时候,我会用三层结构来组织。第一层是基础漫反射,用颜色贴图乘以一个基础色。第二层是次表面散射,用厚度图控制散射强度,用次表面颜色控制散射色调。第三层是高光,用粗糙度贴图控制高光锐利度,用高光颜色控制高光色调。
具体节点连接上,颜色贴图接Base Color,厚度图接Subsurface Scattering的Opacity,粗糙度贴图接Roughness,法线贴图接Normal。然后加一个Two Sided Sign节点,用来处理法线方向,避免背面法线错误。
高光部分,用两个高光节点叠加。一个用较低的粗糙度,模拟油脂层的锐利高光;一个用较高的粗糙度,模拟表皮层的柔和高光。两个高光节点的权重用曲率图来控制,凸起的地方锐利高光强,凹陷的地方柔和高光强。
实操心得:UE的次表面散射节点有个"Scattering Distribution"参数,控制散射的分布曲线。做皮肤的时候,这个参数给到0.5到0.7之间比较自然。给太低会像蜡,给太高会像果冻。
4.2 光照环境与后期调色
光照是皮肤渲染的另一半。再好的材质,光照不对也白搭。UE的Lumen系统能提供很自然的全局光照,但默认设置下,光照往往偏冷,皮肤会显得没有血色。
我的做法是,主光源用暖色调,辅光源用冷色调,形成冷暖对比。主光源从侧上方打过来,角度大概45度,强度控制在能看清皮肤纹理但不曝光的程度。辅光源从另一侧补光,强度是主光源的三分之一左右,用来填充阴影。
环境光方面,用HDRI贴图提供基础照明,HDRI选那种有柔和天空光的,不要选对比太强的。环境光的强度给到0.3到0.5之间,太高会冲淡主光源的方向感。
后期调色在UE的Post Process Volume里做。重点调三个地方:白平衡、对比度、饱和度。白平衡往暖色调偏一点,让皮肤有血色;对比度适当提高,让高光和阴影拉开;饱和度稍微降一点,避免颜色过艳。
4.3 实时性能与画质平衡
实时渲染最大的约束是性能。皮肤材质用了次表面散射,开销本来就大,再加上毛发、高面数模型,很容易掉帧。
优化的思路有几个。第一,用LOD,远景用低模低材质,近景才用高模高材质。UE的LOD系统可以自动切换,设置好距离阈值就行。第二,限制次表面散射的范围,只让面部、手部这些露出的皮肤用高精度SSS,身体被衣服遮住的部分用普通材质。第三,毛发用发片而不是毛发卡片,发片的面数可控,毛发卡片的面数不可控。
还有一个技巧是用材质实例。把皮肤材质做成材质实例,不同的角色用不同的实例,共享同一个母材质。这样修改母材质的时候,所有实例都会更新,而且运行时性能更好,因为UE对材质实例有优化。
| 优化手段 | 适用场景 | 性能提升 | 画质损失 |
|---|---|---|---|
| LOD切换 | 远景角色 | 高 | 低 |
| 限制SSS范围 | 全身角色 | 中 | 低 |
| 发片替代毛发卡片 | 所有角色 | 高 | 中 |
| 材质实例 | 多角色场景 | 中 | 无 |
| 降低贴图分辨率 | 远景角色 | 中 | 中 |
4.4 动画蓝图与表情驱动
角色做出来是要动的,静态好看不代表动起来好看。UE的动画蓝图系统可以驱动面部表情,但皮肤材质在表情变化时的表现,需要额外注意。
面部表情变化的时候,皮肤的拉伸和挤压会导致法线贴图变形,高光也会跟着变。如果法线贴图烘得太强,表情一大,高光就会扭曲得很奇怪。解决办法是在材质里加一个法线强度参数,表情幅度大的时候,适当降低法线强度,让高光柔和一些。
另外,UE的动画蓝图里可以加材质参数集,用动画曲线驱动材质参数。比如笑的时候,脸颊的次表面散射强度提高,让脸颊更红润;皱眉的时候,额头的粗糙度提高,让额头高光更柔和。这些细节能让角色活起来。
注意:动画蓝图调试的时候,用UE的Debug功能查看材质参数的实际值。我见过有人调了半天材质参数,结果发现动画曲线根本没驱动到材质上,白忙一场。
5. 常见问题与排查技巧实录
5.1 皮肤发灰、发蜡的排查思路
皮肤发灰是最常见的问题,原因通常有三个。第一,颜色空间搞错了。颜色贴图用了Non-Color空间,或者数据贴图用了sRGB空间,都会导致颜色异常。排查方法是看贴图导入UE时的颜色空间设置,颜色贴图必须是sRGB,法线、粗糙度、厚度必须是Non-Color。
第二,次表面散射强度不够。SSS强度太低,皮肤就没有通透感,看起来像塑料。排查方法是把SSS强度临时调到1.0,看皮肤有没有变通透,如果有,说明之前强度太低,需要调高。
第三,光照太冷。环境光偏蓝,皮肤就会发灰。排查方法是把环境光关掉,只留主光源,看皮肤颜色是否正常。如果正常,说明是环境光的问题,需要调整HDRI或者环境光颜色。
皮肤发蜡的原因通常是高光太强或者太锐。排查方法是把高光强度临时调到0,看皮肤是否还发蜡。如果还发蜡,说明是SSS的问题;如果不发蜡了,说明是高光的问题,需要降低高光强度或者提高粗糙度。
5.2 法线贴图方向错误的修复
法线贴图方向错误是另一个高频问题。表现是皮肤表面出现奇怪的凹凸,或者高光方向不对。原因通常是Blender和UE的法线贴图坐标系不一致。
Blender用的是OpenGL坐标系,UE用的是DirectX坐标系,两者的绿通道是反的。解决办法是在Blender导出法线贴图的时候,勾选"Flip Green Channel",或者在UE里用材质节点翻转绿通道。
排查方法是把法线贴图单独显示,看凹凸方向是否和预期一致。如果凹凸方向反了,就是绿通道的问题。这个坑我踩过好几次,每次都要重新烘一遍贴图,非常浪费时间。后来我养成了习惯,导出法线贴图之后,先在Blender里预览一遍,确认方向正确再导出。
5.3 毛发闪烁与透明通道问题
毛发闪烁的原因通常是透明通道的排序问题。UE对透明材质的排序是基于物体中心的,发片多了之后,排序就会乱,导致闪烁。
解决办法是用Alpha Test代替Alpha Blend。Alpha Test没有排序问题,但边缘会有锯齿。为了减少锯齿,可以在材质里加一个Dither Temporal AA节点,用抖动来模拟半透明边缘。这样既有Alpha Test的稳定性,又有接近Alpha Blend的柔和边缘。
另一个办法是把发片合并成一个网格,减少透明物体的数量。UE对单个透明物体的排序是稳定的,合并之后就不会闪烁了。但合并之后就不能单独控制每根毛发的动画了,适合静态发型。
5.4 性能骤降的定位方法
性能骤降的时候,先用UE的Stat Unit命令看瓶颈在哪里。如果Game线程高,说明是逻辑或者动画的问题;如果Draw线程高,说明是渲染的问题;如果GPU高,说明是材质或者光照的问题。
如果是GPU高,用Stat GPU命令看具体是哪个Pass开销大。Base Pass开销大,说明材质复杂;Lighting开销大,说明光照复杂;Post Process开销大,说明后期效果多。
定位到具体问题之后,再针对性优化。材质复杂就简化节点,光照复杂就减少光源,后期多就关掉一些效果。我一般会先关掉SSS,看性能提升多少,如果提升明显,说明SSS是瓶颈,需要降低SSS精度或者限制SSS范围。
| 问题现象 | 可能原因 | 排查命令 | 解决办法 |
|---|---|---|---|
| 皮肤发灰 | 颜色空间错误 | 检查贴图设置 | 修正颜色空间 |
| 皮肤发蜡 | 高光过强 | 临时关高光 | 降低高光强度 |
| 法线方向错 | 绿通道反了 | 单独显示法线 | 翻转绿通道 |
| 毛发闪烁 | 透明排序问题 | 检查材质混合模式 | 改用Alpha Test |
| 性能骤降 | SSS开销大 | Stat GPU | 限制SSS范围 |
5.5 跨软件协作的避坑清单
最后整理一份跨软件协作的避坑清单,都是我在实际项目里踩过的坑。
- 单位不一致:Blender默认单位是米,UE默认单位是厘米。导出FBX的时候,要确认单位缩放设置,否则模型进UE会大100倍或者小100倍。
- 坐标系不一致:Blender是Z轴向上,UE是Z轴向上但Y轴方向不同。导出FBX的时候,要勾选"Y Up"或者"Z Up",根据UE的导入设置调整。
- 材质节点不能直接搬:Blender的材质节点和UE的材质节点是两套系统,不能直接复制粘贴。要在UE里重新连节点,Blender的材质只能作为参考。
- 贴图路径要统一:Blender里贴图路径变了,UE里就会丢贴图。导出之前,把所有贴图放在一个文件夹里,用相对路径引用。
- 动画曲线要检查:Blender的动画曲线导进UE之后,可能会因为插值方式不同而变形。导入之后要预览一遍,确认动画正常。
实操心得:跨软件协作最怕的就是"想当然"。你以为两边设置一样,实际上差一点,结果就是几小时的排查。我的习惯是,每次导出之前,先导一个测试模型,确认流程通了,再导正式资产。这个习惯帮我省了无数时间。
6. 从这套方案延伸出的工作流思考
这套UE加Blender的皮肤渲染方案,本质上是在实时和离线之间找平衡点。纯离线渲染画质好但效率低,纯实时渲染效率高但画质差,两边结合,各取所长,是目前比较务实的做法。
我在实际项目里用这套流程做过几个角色,最大的感受是前期准备比后期调试重要。Blender里的模型拓扑、UV、贴图烘焙,这些基础工作做扎实了,UE里的材质调试就会很顺。反过来,如果基础没打好,UE里怎么调都别扭,最后还得回Blender返工。
另一个感受是参数不要照搬。网上有很多皮肤材质的参数分享,但每个人的模型、贴图、光照都不一样,照搬参数往往效果不好。我的做法是,先理解每个参数的作用,然后根据自己的资产微调。比如SSS强度,别人的模型可能给0.5合适,你的模型可能给0.3或者0.7才合适,这得自己试。
这套流程后续还可以扩展。比如接入面部捕捉,用实时表情驱动角色,皮肤材质跟着表情变化;或者接入AI辅助贴图生成,用AI生成皮肤纹理的基础层,再手动加工细节。这些方向我还在摸索,有新的心得再分享。
最后说一个我个人的小技巧:做皮肤渲染的时候,旁边放一张真实的人脸照片做参考。不是让你照着照片做,而是让你随时对比色调、高光、通透感。人眼对皮肤的敏感度很高,有参考和没参考,做出来的东西差别很大。这个习惯我从入行保持到现在,每次做角色都会用。