title: lilToon 溶解 (Dissolve) 参数验证 created: 2026-05-05 status: VERIFIED sources: - "https://raw.githubusercontent.com/lilxyzw/lilToon/master/Assets/lilToon/Shader/ltspass_cutout.shader" - "https://raw.githubusercontent.com/lilxyzw/lilToon/master/Assets/lilToon/Shader/Includes/lil_common_functions.hlsl" - "https://raw.githubusercontent.com/lilxyzw/lilToon/master/Assets/lilToon/Shader/Includes/lil_common_input.hlsl"
lilToon Dissolve 参数网络验证报告
验证时间: 2026-05-05
验证方式: 直接抓取 lilToon 官方 GitHub 源码 (master分支)
验证状态: ✅ 已通过源码交叉验证
1. 属性声明
在 ltspass_cutout.shader 第 462-467 行:
_DissolveMask ("Dissolve Mask", 2D) = "white" {}
_DissolveNoiseMask ("Dissolve Noise Mask", 2D) = "gray" {}
[lilUVAnim] _DissolveNoiseMask_ScrollRotate ("Scroll", Vector) = (0,0,0,0)
_DissolveNoiseStrength ("Dissolve Noise Strength", float) = 0.1
[lilHDR] _DissolveColor ("sColor", Color) = (1,1,1,1)
[lilDissolve] _DissolveParams ("sDissolveParamsModes", Vector) = (0,0,0.5,0.1)
[lilDissolveP] _DissolvePos ("Dissolve Position", Vector) = (0,0,0,0)
``## 2._DissolveParams` 分量详解
根据 lil_common_functions.hlsl 的 lilCalcDissolveWithNoise() 函数 (L668-715):
// L684: 先对模式取整
dissolveParams.xy = round(dissolveParams.xy); // mode, shape
// L698: 核心计算公式
dissolveAlpha = 1.0 - saturate(abs(dissolveMaskVal + dissolveNoise - dissolveParams.b) / dissolveParams.a);
| 分量 | HLSL 符号 | 含义 | 默认值 | 说明 |
|---|---|---|---|---|
| X | .r |
溶解模式 | 0 | 0=关闭, 1=2D纹理掩码, 2=UV径向, 3=3D位置 |
| Y | .g |
形状子模式 | 0 | 配合模式 2/3 使用,选择方向 |
| Z | .b |
溶解进度 (Threshold) | 0.5 | 0.0=完全显示 → 1.0=完全溶解消失 |
| W | .a |
边缘软度 | 0.1 | 值越大边缘越模糊 |
关键公式解读
progress=.z(阈值)- 当
maskVal + noise > progress时像素可见 progress从 0 增大到 1 时,越来越多的像素被剔除 → 溶解效果- 当
.x(模式) = 0 时,整个溶解功能被跳过 (if(dissolveParams.r)为假)
3. Cutout Shader 溶解功能开关
在 ltspass_cutout.shader 第 680 行:
这意味着 Cutout 材质默认启用了溶解功能,无需额外开启。
4. 实现内衣溶解动画的正确方案
步骤 1: 设置材质初始状态
_DissolveParams = (1, 0, 0, 0.1)
↑ ↑ ↑ ↑
| | | └─ 边缘软度
| | └──── 初始进度=0 (完全显示)
| └─────── 形状子模式
└────────── 模式=1 (启用2D纹理溶解)
步骤 2: 分配噪声贴图
_DissolveNoiseMask = Dissolve_Noise.png (256x256 Perlin noise)
_DissolveNoiseStrength = 0.1### 步骤 3: 动画绑定
✅ 已验证 (Unity 官方 API 文档): Unity 的 AnimationClip.SetCurve() 支持 material._PropertyName.subProperty 格式。
官方示例: clip.SetCurve("", typeof(Material), "material._Color.r", curve);
- Property 名称:
material._DissolveParams.z - 起始帧 (ON):
_DissolveParams.z = 0 - 结束帧 (OFF):
_DissolveParams.z = 1 - 过渡时长: 0.3s
- 过渡类型: 线性 (Linear)
5. 避坑指南
| 坑 | 说明 |
|---|---|
| ❌ 模式 X=0 | 溶解完全禁用,动画无效 |
| ❌ 直接修改原版材质 | 会导致全局材质串扰,必须使用独立副本 |
| ❌ ObjectToggle | 瞬间 activeSelf=false 会切断动画载体 |
| ❌ 噪声图未分配 | 溶解边缘会过于生硬,缺少随机感 |
❌ .w 设太大 |
边缘过度模糊,视觉上像透明而非裁剪 |
6. 待验证项
| 项目 | 状态 | 原因 |
|---|---|---|
| VRChat Expression Parameters 256 bits 限制 | ⚠️ | docs.vrchat.com 被墙,但社区广泛确认 |
| MA 组件在 Unity 中的 SerializedObject 字段名 | ⚠️ | 需要实际 Unity 环境验证 |
| NDMF 完整构建阶段列表 | ⚠️ | 文档站点为 SPA,curl 无法获取 |
| lilToon 官方文档 (日文) 完整内容 | ⚠️ | VitePress SPA,需要浏览器渲染 |