做二次元角色渲染的人,多少都会绕不开一个名字:Unity-Chan Toon Shader,简称UTS。我最早接触它,是因为想复刻Unity酱那套经典的日式卡通脸部光照,结果发现网上教程要么只讲怎么拖参数、要么直接甩一份Shader源码让人自行研究,几乎没有一篇能把“这个参数为什么存在”“调它到底在调什么”讲清楚的。这篇就按我实际学习、踩坑和落地的顺序来写,从光照原理讲到材质面板里的每个关键旋钮,再补充几个项目里非常实用的风格化技巧和排查思路,希望能帮刚开始学卡通渲染的人少走一段弯路。
1. 先搞清楚:UTS到底在解决什么问题
1.1 卡通的“假”其实是一套精确的简化规则
理解UTS之前,得先放下“卡通渲染=勾边+扁平颜色”这个粗糙印象。传统PBR渲染的目标是模拟真实光照,光打过来,漫反射连续过渡,高光按GGX分布衰减,整个画面是物理正确的。但日式卡通角色设计没有真实皮肤、真实布料,它是用几块大面积色块来暗示体积的,想要的是“看起来有结构、但不真实到令人不安”的中间状态。
UTS做的事,就是把PBR里连续的光照响应强行分割成几段阶梯。最典型的是把漫反射切成两段或三段:亮部保持原本的基础色,暗部整体压暗成另一个色,中间再用一段可调的过渡带做柔和渐变。这就是大家常说的两色阶、三色阶。它不是“简化到没有光照”,而是“用有限的颜色层级模拟光照方向”,模型一转,亮部和暗部会跟着光源方向整体移动,这种移动本身就是卡通角色立体感的主要来源。
很多新手调出来的角色看起来“脏”或“死板”,根源其实都出在色阶数量、过渡范围、暗部色彩这三个变量没有配合好。UTS最大的价值,就是把这套逻辑整理成一套可视化的材质参数,你不用去写Shader,也能把效果控制在比较高的下限。而它能成为事实标准,是因为Unity官方角色“Unity酱”就是用它渲染的,工程完全公开,等于官方替所有人验证过这套方案在角色上的可行性。
1.2 从Lambert到阶梯化:一个简单的数学直觉
为了让你知道自己在调什么,这里说点底层逻辑。传统漫反射最常用的是N·L,也就是法线方向和光源方向的点积,值域在-1到1之间。真实渲染里会用这个值做连续映射,光一斜,亮度就连续降低。UTS的卡通化处理,本质上是对这个连续值做了一次“取整”,具体手段可以理解成比较阈值:
当N·L大于某个阈值时,认为这个像素处于亮部,返回基础色;小于阈值时,认为处于暗部,返回阴影色。阈值本身可以通过参数挪动,这就是“阴影位移”(Shade Shift)。为了让分界线不那么生硬,再引入一段过渡区间,在区间内做平滑插值,这就是“阴影柔化”(Shade Feather)。你在面板里拖的Toony值,可以理解为控制这段过渡区间有多宽,值越高过渡越窄,分界线就越硬。
对,核心就是个分段函数。所以调整卡通渲染有一个所有参数背后的主轴:唯一需要关注的永远是如何划分N·L的值域。之后想加第二级阴影、高光、边缘光,都是在这个分段函数上叠加新的判断条件。理解到这一层,后面所有参数都只是“在这个数学逻辑上开开关”。
2. 环境搭建与第一次调色:从工程到第一个三色阶效果
2.1 版本与资源准备
UTS有两个常见大版本:2.0和3.0。2.0是基于内置渲染管线的传统Shader,结构清晰、参数面板直观、网上资料多,非常适合学习阶段使用;3.0是基于Shader Graph重写的,分内置管线、URP、HDRP三个版本,功能更强,但也引入了可编程渲染管线的概念。如果你刚开始学,又是纯美术向,建议直接从2.0入手,先把参数和光影原理吃透,再迁移到3.0会轻松很多。
资源方面,你不需要从零建场景。Unity Asset Store里搜Unity-Chan,能找到官方发布的UnityChan模型和配套工程,记得找带ToonShader的那个版本,里面已经有配置好的材质和场景。不想用官方模型的,随便一个带法线的低模角色也能练,但不要用那种只有顶点色没有法线的工业模型,后面调阴影会很痛苦。
安装上没什么坑,把包导入到工程就能用。检查一下材质面板,Shader下拉菜单里能看到以“UnityChan/Toon”开头的选项,就说明装好了。如果你的工程是URP,建议新建一个内置管线的工程来练,或者改用UTS3的URP版本,强行混用会出现材质全粉的情况。
2.2 从一个纯色球开始,而不是直接调角色
我的建议是别一上来就调完整角色,先随便建一个球体,把Shader换成“UnityChan/Toon”,然后只调三个东西:基础色选一个不发灰的固有色,阴影色选一个比基础色暗20%且稍微偏冷的颜色,然后拖阴影位移和柔化,观察球体上的明暗分界。球体表面法线连续,能最直观地反映参数变化,等球体上手了再动角色模型,效率高得多。
具体操作可以按这个顺序来:
- 创建球体,新建材质,Shader选“UnityChan/Toon”。
- 把基础色设为固有色,比如肤色(1.0, 0.85, 0.8)。
- 把一级阴影色设为比基础色更深的肤色(0.75, 0.6, 0.55)。
- 打开阴影设置,先看默认效果,然后一点点调大或调小阴影位移,观察明暗分界线的移动方向。
- 把阴影柔化从0往上拉,观察硬边变成软边的过程。
你在球体上看到的那个明暗分界,就是整个卡通渲染的核心区域。之后所有的贴图、法线修正、描边,本质上都是在让这道分界线变得更符合角色形体。
2.3 配置一个稳定的三色阶角色材质
球体练完,回到角色模型上。一个完整的三色阶卡通材质,通常包括基础色、一级阴影色、二级阴影色这三层。一级阴影一般作用于整体受光不足的区域,比如侧下方;二级阴影用于类似裙底、腋下、头发与脸部交界这些闭塞区域。
在UTS面板里的操作逻辑是:先把基础色、一级阴影色、二级阴影色三个色块选好,然后决定一级阴影的范围,再决定二级阴影在一级阴影里占多少比例。二级阴影的比例一般控制在10%到30%,颜色要更深,有时可以带一点环境色的倾向,比如在暖光场景里甚至可以加一点紫灰。
第一次调完整角色最容易出现的问题,是阴影面积过大,整个人像站在阴天里。这通常是因为你把阴影位移调得太靠正数了。记住一个判断标准:主光源在左前上方时,角色右侧大面积出现阴影属于正常,但整张脸超过一半落在阴影里就要往回拉。脸部阴影是另一个话题,后面单独讲。
3. 参数逐项拆解:像调音台一样控制你的卡通效果
3.1 颜色层级的核心参数一览
UTS的参数很多,但真正决定大部分效果的,就是下面这一组。我把它们整理成一张速查表,后面调材质时可以对照着用。
| 参数名 | 作用 | 调节建议 |
|---|---|---|
| Basic Color | 基础色,材质主色 | 使用固有色,不要过亮或过暗 |
| 1st Shade Color | 一级阴影色 | 比基础色暗15%~30%,可轻微偏冷 |
| 2nd Shade Color | 二级阴影色 | 比一级阴影色更暗,用于闭塞区 |
| Shade Shift | 阴影位移,控制阴影范围大小 | 正数整体变亮,负数整体变暗 |
| Shade Feather | 阴影柔化,控制过渡带宽度 | 追求硬边设为0,追求柔和适当增加 |
| 1st/2nd Shade Map | 阴影控制贴图 | 灰度图,白区域强制进入阴影 |
| Highlight Color | 高光颜色 | 一般比基础色亮,或接近纯白 |
| High Color Tone Step | 高光阈值 | 越大高光越少越硬,越小高光越多越散 |
| Outline Width | 描边宽度 | 常用0.01~0.05,按模型大小调整 |
| Rim Light | 边缘光强度与颜色 | 增强轮廓分离感时开启 |
第一眼看到这么多参数不要慌,真正需要频繁改的其实就三个:阴影位移、阴影柔化、阴影色。其他参数是“装饰音”,先掌握主旋律,再一个一个加起来。
3.2 阴影位移不是简单的“变亮变暗”
很多教程会告诉你“Shade Shift数值越大,阴影越少”,这话对但不完整。更准确的理解是,它是把整个明暗分界线沿光源方向整体平移。你可以把它想成在球体上画了一条赤道,赤道往光源方向推,亮部区域变大;往背光方向推,暗部区域变大。
实际操作里有几个经验值供参考:常规角色在大约45度主光下,Shade Shift设置在-1到0之间比较安全,再低的话面部阴影就会爬升到颧骨以上。场景里如果有强背光,可以适当把阴影方向调整成结合主光方向,但这些是基于常见实践的补充,具体还要按你的主光源和模型解算来微调。
另外要注意,UTS阴影并不是只由一个参数控制的。一级阴影和二级阴影各自又有独立的位移和柔化,但它们会受同一个“全局阴影方向”逻辑约束。调材质时要养成一个习惯:每次只动一个参数,观察变化,记下来,再动下一个。不要同时拖位移和柔化,那样你根本不知道是哪个产生的问题。
3.3 阴影控制贴图的真正用法
参数能控制的阴影是全局的、均匀的,但真实角色需要的是“有些地方必定暗,有些地方必定亮”,这时候就要上阴影控制贴图。UTS里的1st/2nd Shade Map本质是灰度遮罩,白色区域会被强制视为阴影区域,黑色区域不会受阴影影响,灰色区域则是让参数正常运作。
最典型的就是裙摆内侧、两腿之间、腋下、口罩下方这些常年不见光的地方。没有贴图时,你得靠全局阴影位移去让这些地方暗下来,结果整个角色都跟着暗;有了贴图,你可以在对应区域涂上白色,让它们恒定处于阴影中,其他区域该亮还是亮。
制作上不需要写Shader。把模型的UV展开,在Photoshop里对着UV涂灰度,然后保存为可读的贴图,拖进材质面板就行。关键细节是贴图边缘一定要做羽化,除非你想要一条清晰的硬边,否则生硬的涂抹会让角色身上出现肉眼可见的分界线。
4. 日系风格化的核心技巧:面部、头发与描边
4.1 面部法线修正:解决“脸脏”的关键一步
日系卡通角色脸部阴影容易出现两个问题:一是阴影边界沿着鼻子、颧骨这些起伏走,形成难看的轮廓线;二是角色脸部转角度时,阴影会突然跳动而不是平滑移动。原因其实很简单,模型面部法线太“真实”了,每个顶点都按真实几何方向朝外,导致光照在该区域迅速变化。
解决办法是使用面部专用的法线修正贴图。思路是:在制作模型时,把面部法线尽量统一到一个大方向,让脸部近似一个平面,再制作一张法线贴图,把鼻翼、嘴唇这些细节以凹凸形式画回去。渲染时使用这张修正法线,光照就会把脸当成一个稍微平整的曲面来处理,阴影过脸时平滑得多。
在UTS里操作不复杂:把修正好的法线贴图拖进Normal Map槽,开启法线影响基础色相关开关,让法线贴图不只影响高光细节,还参与阴影计算。如果找不到现成的面部法线贴图,可以在Blender里把脸部法线平均化后烘焙一张,这是“基于常见实践的补充”,但确实是整个日式渲染里投入产出比最高的操作。
4.2 头发高光与时髦的两段式高光
卡通头发的质感很大程度上由高光决定,而不是基础色本身。真实头发的PBR高光是连续的高光带,但卡通头发的理想效果是一条有清晰边界、粗细分明的色带,甚至是两条。UTS可以做到前向高光和传统高光混合,也就是同时存在一个顺着光源方向的高光区域和一个偏轮廓的边缘高光区域。
实际操作时,把高光阈值拉到偏大,让高光区域收窄,再把高光贴图画成一条有宽度变化的带子,配合透明度来控制范围,效果会比直接用默认高光自然得多。想让高光看起来更“二期动画”,可以调高High Color Tone Step,让高光边缘更硬;想要柔和一点的,降低高光阈值,并适当打开高光柔化。
头发高光的贴图制作有一点很关键:高光带的位置要和发型设计线对齐,而不是机械地画在UV正中。刘海高光一般在额头偏上,侧发高光位于耳上区域,发梢一般不画。这个看起来是美术琐事,但高光位置错一点,角色气质会完全不同。
4.3 描边的宽窄控制与常见爆边问题
UTS的描边有两种实现逻辑:一种是顶点挤出,做法是把角色模型沿顶点法线方向向外膨胀一圈,背面渲染成一个纯色mesh,正面的模型盖在上面,视觉上就得到一条描边;另一种是通过PS后处理做边缘检测,不改变模型顶点。UTS默认使用前者,所以描边宽度会直接受模型顶点法线质量影响。
描边参数本身不复杂,Outline Width稍微调小一点就是常规粗细,真正的问题是“爆边”。模型如果有尖锐棱角或法线断裂,挤出时会出现一根根向外刺的刺,非常难看。解决思路有两个方向,一是给模型顶点色一个衰减权重,在UV或顶点色通道里控制局部描边宽度;二是把模型法线做平滑处理,让挤出方向变得更均匀。这些操作在建模软件里做比在材质面板里做更有效。
另外要注意,UTS描边是背向渲染的,某些引擎设置下会被忽略。遇到描边渲染不出来,先检查模型的面朝向,再检查是否开启了背面剔除。还有描边不要在整个角色上统一粗细,真实手绘动画里,下巴、刘海边缘的描边一般会比其他区域略金,这种细节通过贴图或顶点色控制才能做到位。
5. 高频问题排查与项目落地注意点
5.1 角色发黑、发灰、阴影不动的排查思路
学习UTS时最常遇到的坑,我按“现象-原因-解法”整理成一张速查表,基本上对着排查就能解决:
| 现象 | 常见原因 | 解决办法 |
|---|---|---|
| 角色整体发黑,亮度很低 | 主光源强度不足,或环境光被关 | 确认场景有方向光,尝试增强环境光强度 |
| 材质看起来和普通PBR没区别 | Shader没切换成功,或贴图覆盖了阴影色 | 确认材质Shader是UnityChan/Toon |
| 阴影边界粗糙、有明显锯齿 | 阴影柔化太低,或过渡区域贴图有硬边 | 适当提高Shade Feather |
| 角色转角度时阴影跳变 | 面部法线过于起伏 | 使用面部法线修正贴图 |
| 描边位置出现刺状凸起 | 模型法线断裂或顶点法线不平滑 | 重建或平滑法线,控制顶点色权重 |
| 阴影完全不跟随光源 | 光照模式设置成不受光 | 把方向光设为实时或混合 |
角色发黑还有一个隐藏原因,是材质中的环境光参数被覆盖了。很多人在调色时为了加深阴影,会把环境光权重降到很低,结果阴影确实变深了,但暗部细节也全丢光了。正确做法是暗部颜色用阴影色来控制,而不是靠压低环境光来制造对比度。
5.2 从单材质到一套角色:材质分组与性能整理
实际项目中一个角色往往要拆成脸、头发、身体、配饰、眼睛等多个材质,而不是整只用一个材质。原因很简单,脸需要法线修正贴图,头发需要高光贴图,身体和裙子需要阴影控制贴图,每部分的参数差异很大。如果共用一个材质球,改一个部分会牵动全部,非常痛苦。
通用做法是把角色拆成4到8个材质组,每个组独立调参。脸部一个,头发一个,身体上半身一个,下身裙子一个,眼睛和配饰单独一个。分组太多会增加Draw Call,但现在合批手段多,影响不大:可以开启 Static Batch,或做材质变体裁剪。对学习项目来说,先把分组和命名规范做好,远比追求极致性能重要。
性能层面,UTS材质面板里有很多不常用的开关,比如高光、边缘光、自发光,这些开关本质是Shader Keyword。打包时如果全部开关都保留,会生成大量Shader变体,包体和加载时间都会膨胀。建议在项目功能稳定后,把没用到效果对应的Keyword裁剪掉。具体操作在材质球上关掉对应功能,或利用Unity的Shader Variant收集器清除无用变体。
5.3 与后期处理搭配时的两个真实经验
卡通角色放到现代渲染流程里,几乎一定会开抗锯齿和辉光,但两者都要小心使用。抗锯齿方面,UTS的硬边阴影和描边在MSAA下表现不错,但在TAA下容易出现边缘抖动,因为TAA会把硬边当成高频信息去平滑。如果角色表演时边缘闪烁严重,可以试试关掉TAA改回MSAA,或者给描边材质稍微提高一下宽度,给后期留出容差。
辉光主要集中在高光区域。很多二次元游戏角色头发高光都在发光,原理就是让高光颜色超过HDR范围,然后配上Bloom。实际操作时,可以把头发高光的颜色亮度提高到1.2以上,Bloom强度由场景统一控制。要注意的是,Bloom太强会把整个人物的轮廓都糊掉,正确用法是只让高光区域亮,人物身体基础色保持在LDR范围。
后期还有一个很容易被忽视的点:色彩空间。UTS材质本身允许在线性空间下表现更好,如果项目使用Gamma空间,角色的阴影过渡会显生硬。有条件的话,在Player Settings里把颜色空间改成Linear,很多阴影和色彩脏的问题会一次性改善。
一些我自己踩出来的额外提示
前面把UTS的参数和流程讲了一遍,这里补充几个常规教程不会写但真正影响体验的细节。环境光照强烈时,角色阴影色要偏冷,否则亮部暖、暗部也暖,整个人看起来黏糊糊的;环境光是冷光时,阴影色可以往紫红方向偏一点,这样角色肤色会显通透。这个方法在日式渲染圈很常用,但很少有人单独讲。
另外,UTS里顶点色不是摆设。它可以控制描边宽度、控制高光强度、控制阴影位置,甚至可以用顶点色做局部的“非真实感”修正。比如你想让裙子边缘阴影深一点,直接在对应顶点上涂色,比画贴图更快,还能随模型动。当然这需要美术工具链支持,Sketchfab上下载的模型一般不带顶点色权重,得自己处理后才有这个效果。
最后想单独说说学习路径。这个Shader难吗?真不难,但很容易在半懂不懂时反复遇到“调了没反应”的挫败感。我自己的体会是,把所有参数恢复成默认值,然后分别单独调大调小每一个滑块,观察它对场景的贡献,形成一种“肌肉记忆”。你用球体练一遍参数,再回角色上调整,效率会高很多。这个方法不需要记哪个参数对应哪个功能,只需要花两个小时把Shader面板从头到尾拨一遍,比看十篇教程都更直观。