LiliumToonGraph动漫头发着色器教程:3步实现Kajiya-Kay各向异性头发高光
【免费下载链接】LiliumToonGraphUniversalRP Toon Shader with ShaderGraph项目地址: https://gitcode.com/gh_mirrors/li/LiliumToonGraph
LiliumToonGraph是一款基于 Unity URP(通用渲染管线)ShaderGraph 构建的开源卡通着色器(Toon Shader)包。本教程面向新手,带你用它的头发着色器图,3 步实现 Kajiya-Kay 各向异性头发高光,无需手写 Shader 代码。无论你正在做动漫风 3D 角色、2.5D 游戏,还是虚拟形象渲染,这份 Unity 动漫头发着色器教程都能让你快速上手。
为什么动漫角色需要"各向异性"头发高光?
真实头发由无数根细长的发丝组成。普通卡通着色器的高光是一个"圆点"(各向同性),而动漫渲染里的高光会顺着发丝方向拉成一条细长亮带,并且能绕过整个头部——这就是各向异性(Anisotropic)高光。
| 对比项 | 各向同性高光 | Kajiya-Kay 各向异性高光 |
|---|---|---|
| 高光形状 | 圆点 | 沿发丝方向的细长亮带 |
| 依赖向量 | 法线 | 切线(Tangent,即发丝方向) |
| 典型效果 | 金属球、塑料 | 动漫头发、毛发 |
Kajiya-Kay 模型用**双高光瓣(Primary + Secondary)**分别模拟光线从发丝正面与背面散射的效果,再通过"切线偏移(Tangent Shift)"让高光自然地弯曲环绕头部。这正是本项目的头发着色器核心。
准备工作:环境要求与获取项目 📌
环境要求(见 package.json 与 README):
- Unity 2020.2.6f1 或更高版本
- Universal Render Pipeline v10.3.1
获取项目并打开示例场景:
git clone https://gitcode.com/gh_mirrors/li/LiliumToonGraph用 Unity 打开仓库后,推荐先查看两个示例场景:
Assets/Samples/ToonSample.unity:卡通着色器全家桶效果展示Assets/Samples/HairSample.unity:头发着色器专用场景
项目内置了成套的头发贴图素材,位于Assets/Samples/Hair/目录,包括基础灰度图、法线图和 specular 图:
第一步:认识头发着色器的核心节点 🧩
项目的头发着色器图位于Assets/Samples/ShaderGraphs/Stylized Hair.shadergraph,它由三个部分协作完成:
- Stylized Hair.shadergraph—— 主图,负责卡通光照(Toon Lighting)、轮廓线(Outline Transform)与最终输出;
- Stylized Hair Specular.shadersubgraph(
Assets/Samples/SubGraphs/)—— 头发高光子图,内部再调用: - KajiyaKay Anisotropy.shadersubgraph—— 各向异性高光子图,其底层实现是 KajiyaKayAnisotropicDirectSpecular.hlsl 中的
KajiyaKayAnisotropicDirectSpecular函数。
Kajiya-Kay 各向异性高光的算法核心只有几行逻辑:先把切线沿法线方向偏移(ShiftTangent),再按sin(θ)^exponent计算发丝高光强度(StrandSpecular),最后把两个高光瓣的结果相加。
Kajiya-Kay 各向异性高光强依赖法线贴图来描述发丝朝向。项目自带的头发法线图如下:
第二步:Kajiya-Kay 高光管线是如何工作的 ⚙️
在Stylized Hair图中,高光管线的数据流如下(可对照主图节点连线):
// 简化示意:每个像素的高光计算流程 1. NormalMap / Strip Shift Map → 得到发丝方向(切线 Tangent) 2. KajiyaKayAnisotropicDirectSpecular(Tangent, Normal, Light, View, ...) 3. 高光强度 × Hilight Color(双层颜色分别着色) 4. 高光结果叠加到卡通光照输出上你可以把这条管线理解为一句话:"沿着法线贴图里的发丝方向,把高光拉成亮带,再按双层颜色上色。"
F00_000_Hair_00_01.png这类竖条纹灰度图作为Strip Shift Map,用来控制发丝的高光条纹分布;F00_000_Hair_00_nml.png、F00_000_HairBack_00_nml.png作为NormalMap,提供发丝弯曲方向;- 基础颜色则使用普通的角色贴图,例如项目中 Unity-chan 的卡通颜色图集(亮色版):
第三步:调出漂亮的动漫头发高光 ✨
打开Assets/Samples/Hair/下的预设材质(Stylized Hair Black、Stylized Hair Blue、Stylized Hair Gold、Stylized Hair Toony Black),对照 Inspector 微调以下参数即可:
| 参数 | 作用 | 调参建议 |
|---|---|---|
| 1st / 2nd Layer Hilight Color | 内外两层高光颜色 | 金色/粉色常见于发丝边缘 |
| 1st / 2nd Layer Exponent | 高光瓣的锐度 | 数值越大,亮带越细越锐 |
| 1st / 2nd Layer Shift | 高光瓣的切线偏移量 | 让高光弯曲绕过头部 |
| Tangent Rotation | 切线旋转角度 | 发丝方向不对时用它校正 |
| Hilight ColorMap | 高光颜色贴图 | 用贴图局部控制高光强弱 |
| Strip Shift Map | 发丝条纹分布图 | 条纹断裂、杂乱时更换 |
实用调参口诀:先定双层高光颜色(外亮内暗更有层次)→ 用 Exponent 控制亮带粗细 → 用 Shift 让高光"绕过头顶" → 最后用 Hilight ColorMap 做局部细节。
常见问题 FAQ ❓
- 高光没有出现?优先检查模型是否有切线数据、法线贴图是否接入 NormalMap 槽位——Kajiya-Kay 各向异性高光没有切线方向就无法工作。
- 高光方向不对?调整 Tangent Rotation,或确认法线贴图与模型的 UV 一致。
- 性能注意:该项目当前版本为
0.5.0-preview.5(见 CHANGELOG.md),README 中说明部分实现处理效率一般,建议在正式项目中评估开销后再使用。
小结
通过Stylized Hair着色器图 +KajiyaKay Anisotropy子图 + HLSL 底层函数三层结构,LiliumToonGraph 让新手也能在 ShaderGraph 里零代码实现 Kajiya-Kay 各向异性头发高光:认识节点 → 理解切线驱动的高光管线 → 双层颜色调参,三步即可完成一个有动漫感的头发高光。项目内置的HairSample场景与全套贴图素材,就是现成的调参试验场。
【免费下载链接】LiliumToonGraphUniversalRP Toon Shader with ShaderGraph项目地址: https://gitcode.com/gh_mirrors/li/LiliumToonGraph
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考