控制阴影的形状
影响阴影形状的因素主要有表面法线, 自阴影, 其他物体的投影.
表面法线产生的阴影是指光线在照射到物体表面时, 表面法线和光线方向的夹角越大, 则单位面积受到的光照能量越少, 所以法线和光照方向越接近90º越暗:

自定义来自自身或其他物体的投影
MooaToon提供光线追踪和阴影偏移两种方式来移除杂乱的自阴影, 并保留来自场景的投影.
光线追踪方法提供了完整功能, 在性能允许的情况下请优先使用光线追踪. 阴影偏移只是性能不足或设备太旧时的备选方案.
- 光线追踪
得益于光线追踪可以获得具体的材质信息, 可以通过材质属性来控制光线追踪阴影的行为.
MooaToon提供了禁用自阴影和对不同ID的投影的功能.
借助这两个功能, 你可以实现:
- 让一个角色完全禁用自阴影, 并接收来自其他角色或场景的投影
- 将同一个角色分成几个不同部位, 每个部位禁用自阴影, 并接收来自其他部位或场景的投影
要使用这些功能你首先需要为角色的不同部分设置不同的ID.
设置ID
MooaToon通过ID来判断射线当前命中的材质是否和射线起点的材质属于同一部分, 你可以选择以下两个方法中的一个设置ID:
- ID Map
ID Map是指将角色的不同部位填充不同的纯色, 以便在制作贴图或者后期时方便抠图, 在影视工作流中通常是必备的贴图, 其分辨率可以很低, 只要保证不溢出UV边界即可.

通过使用ID Map你可以在一个材质中精确到像素地控制ID:
受GBuffer位深限制, ID Map中不同的ID之间需要有足够的差异 (8 / 255).
ID Map的颜色空间必须是线性(在贴图资产中取消勾选sRGB).
- 分离材质并设置ID Offset
还有一种简单的办法, 你可以为角色不同部位设置不同的材质, 每个材质设置不同的ID Offset即可.
这个方法虽然不需要ID Map, 但会产生更多的绘制调用, 会略微提高渲染性能开销, 请酌情使用.
禁用自阴影
正确设置ID之后, 可以使用Disable Self Shadow来禁用角色各个部分的自阴影:
![]() | ![]() |
|---|
你可以看到角色每个部分对自身杂乱的自阴影已经消失.
禁用对不同ID的投影
接下来启用Disable Cast Shadow on Toon:
![]() | ![]() |
|---|
现在你可以看到除了法线阴影以外的阴影全部消失了.
- 阴影偏移
作为光线追踪之外备选方案, 可以简单地在光源空间深度测试中偏移像素深度, 从而在一定距离内消除所有阴影.
你可以在以下位置找到Shadow Bias参数:
Post Process Volume > MooaToon > Shadow BiasBP_MooaLookDevTool > Post Process > Shadow Bias
提高Shadow Bias可以移除来自一定距离内的遮挡物的投影. 例如将Shadow Bias设为200意味着从角色模型表面为起点, 到光源方向200厘米以内的物体不会对角色产生投影:
![]() | ![]() | ![]() | ![]() |
|---|---|---|---|
| Shadow Bias: 0 | Shadow Bias: 10 | Shadow Bias: 30 | Shadow Bias: 150 |
- 阴影偏移只对光线追踪以外的阴影生效.
- 在阴影偏移距离之外可能会突然出现阴影.
- 由于UE本身算法问题, 阴影偏移对于不同类型的光源以及光源和相机不同的距离下可能不一致.
自定义头发阴影
绘画作品中的发影通常和头发轮廓一致, MooaToon提供了屏幕空间深度测试发影可以程序化实现接近手绘的发影, 而无需修改美术资产.
你也可以选择使用半透明模型作为发影, 其形状可以自定义, 但需要修改美术资产.
- 屏幕空间发影
首先需要正确设置脸和头发的ID:
设置脸和头发的ID
如果脸和头发使用不同材质, 那么可以直接通过材质参数指定脸和头发, 否则需要使用ID Map.
- 材质参数
在脸的材质上启用Is Face, 在头发的材质上启用Is Hair即可.
- ID Map
使用DCC软件打开你的ID Map, 记下脸和头发的ID对应ID Channel的值:

将Face ID和Hair ID设为对应的值:
设置发影参数
正确设置脸和头发的ID之后, 在脸材质上启用Use Screen Space Depth Test Hair Shadow:

发影的参数通过Console Variable全局调整, 也可以在BP_MooaLookDevTool中调整.
![]() | ![]() | ![]() |
|---|---|---|
该方法的原理是从当前像素向光源方向平移一段距离后采样深度, 如果采样像素为头发且深度更小则被遮挡.
所以发影形状完全取决于头发在当前视角的形状:
- 半透明模型
这种方法无需引擎支持, 由美术师制作一个单独的半透明模型放在头发下方作为阴影, 形状则由美术师完全可控.
请参考项目: MIKONOTE Anime Toolbox Sample

自定义法线阴影
MooaToon中可以使用以下方式修改法线阴影的形状:
修改法线
修改顶点法线是避免难看的阴影的最直接的方法, 并且适用于不同引擎和渲染器.
你可以选择以下不同的方法来改善法线阴影:
- Houdini法线传递
该方法使用简单模型的法线替换原有模型的法线, 用低成本实现了可控且足够好的结果, 可以满足大部分情况的需求.
这篇文章记录了Arc System Works是如何在Guilty Gear中运用此技术的:
![]() | ![]() |
|---|---|
| 原始法线产生的阴影 | 替换过的法线产生的阴影 |
![]() | ![]() |
|---|---|
| 简化过的模型 | 使用简化模型包裹原模型, 然后原模型查找并替换为最近顶点的法线 |
MooaToon示例中的Unity Chan模型就在Houdini中用此方法处理的, 所有源文件都已经包含在项目中.
Houdini是电影和游戏行业的常用DCC软件, 其强大的节点化工作流和几何功能非常适合用来对角色进行一些程序化的调整, 比如说调整法线, 烘焙AO / Curvature / 任何自定义数据到顶点色和UV, 并且每一步都使用节点表示, 你可以任意修改其顺序和参数而不破坏其他修改.
如果只是传递法线, 其他DCC软件也能简单的做到这一点:
Blender: https://www.youtube.com/watch?v=qgr0AR8R9yg
Maya: https://www.youtube.com/watch?v=6LdtlJ71000, https://80.lv/articles/creating-stylized-leaves-in-maya/
3ds Max: http://www.scriptspot.com/3ds-max/scripts/normal-thief
安装Houdini
- 下载并安装最新的Houdini 19.5, 安装过程需要勾选
SideFX Labs:
- 激活Houdini. 你可以免费试用Houdini Apprentice, 但无法导出FBX等文件.
- 复制一份并打开
MooaToon\MooaToon-Project\Art\Models\MooaToonHoudiniPipelineSample.hip. - 在右下角显示设置中, 启用:
Optimize > Remove Backfaces以显示描边:

传递法线并导出模型
如果你是Houdini新手, 这有些教程可以帮助你快速入门.
- 在
Fbx Character Import节点中修改File路径以导入模型:
- (可选) 在
mooa_setMaterials节点中输入贴图路径, 然后双击Load Textures以加载材质:
- 在
mooa_normalTransfer节点中选择需要传递法线的Group:
- 打开法线显示, 然后按
D键打开Display Options, 修改Scale Normal到合适大小:
- 选中
transform1节点并将其设为Template, 然后按回车键即可实时调整球体的位置和缩放并观察法线的变化:
- 使用左下角的滑条实时调整光照角度:

- 暂时禁用无关节点:

- 使用
OUTPUT_FBX或OUTPUT_OBJ节点导出模型 (Houdini Apprentice版本只支持导出OBJ格式, 无法包含法线以外的顶点数据):
将模型导入UE
导入刚刚的模型到UE, 为了确保烘焙的数据不被破坏, 必须手动调整以下设置:
- 禁用
Recompute Normals/Tangents - 启用
Use High Precision Tangent Basis/Full Precision UVs
为其设置材质后放到场景中检查效果:
右侧模型的阴影形状已经干净多了.














