跳转至

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)
", Vector) = (0,0,0.5,0.1) [lilDissolveP] _DissolvePos ("Dissolve Position", Vector) = (0,0,0,0) ``## 2._DissolveParams` 分量详解

根据 lil_common_functions.hlsllilCalcDissolveWithNoise() 函数 (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 值越大边缘越模糊

关键公式解读

dissolveAlpha = 1.0 - saturate( |maskVal + noise - progress| / softness )
  • progress = .z (阈值)
  • maskVal + noise > progress 时像素可见
  • progress 从 0 增大到 1 时,越来越多的像素被剔除 → 溶解效果
  • .x (模式) = 0 时,整个溶解功能被跳过 (if(dissolveParams.r) 为假)

3. Cutout Shader 溶解功能开关

ltspass_cutout.shader 第 680 行:

#define LIL_FEATURE_DISSOLVE

这意味着 Cutout 材质默认启用了溶解功能,无需额外开启。

4. 实现内衣溶解动画的正确方案

步骤 1: 设置材质初始状态

_DissolveParams = (1, 0, 0, 0.1)
                   ↑  ↑  ↑  ↑
                   |  |  |  └─ 边缘软度
                   |  |  └──── 初始进度=0 (完全显示)
                   |  └─────── 形状子模式
                   └────────── 模式=1 (启用2D纹理溶解)

步骤 2: 分配噪声贴图

_DissolveNoiseMask = Dissolve_Noise.png (256x256 Perlin noise)
_DissolveNoiseStrength = 0.1

_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,需要浏览器渲染