Repository navigation
Releases: njsgdd10086/LilToNonToonSwitcher
Release list
1.3.3
1.3.3
修复
-
MatCap 导致头发出现金属光泽
lilToon 的_MatCapColor允许超过 1(HDR),而 NonToon 的sd.add += matcap * _MatCapAddColor
缺少 lil 的两个衰减环节:_MatCapNormalStrength—— 把模型法线混进采样方向、打散反光- 乘
sd.shadow—— 暗处不反光
于是同一个 HDR 值在 NonToon 下过亮成金属。实测(shinano 的头发):
_MatCapColor = (2.1185, 1.8952, 1.7888),原样搬运后高光(>0.35)像素占比 3.10%,
峰值归一化后降到 0.00%,色相不变。现在第一层与第二层
_MatCapColor都做峰值归一化(除以 max(R,G,B));
想要更亮可以在 MatCap 模块面板里自行调回,日志里会记录归一化前后的值。
包含自 1.3.2 以来的全部内容(遮罩复用、.scmask 尺寸优化、整数属性落盘、亮度均匀化等)。
1.3.2
1.3.2
修复
- 转换中途抛
IndexOutOfRangeException导致整个流程中断(无遮罩源但有自发光的材质,如配件/衣物) - 整数属性写不进序列化数据 ⇒
ShadeGradientIndex实际为 -1 ⇒ Shade 模块处于关闭、烘好的色带完全没用上
⇒ 表现为「暗的时候不均匀、受灯光影响大」 - 亮度不均匀:逐材质亮度补偿实测差 6.6 倍、色带差 40 倍,多组开关切换时同框出现 ⇒ 一块亮一块暗
- 聚光灯下脸偏亮(LightLimit 的亮度被
_Max = 1钳掉,补偿失效)
优化(体积 / 显存)
.scmask尺寸不再写死 1024(原来每个材质都吃 1024x1024 RGBA32 + mipmap = 5.33 MB)- 单源材质直接复用源贴图做遮罩,零精度损失
- 无自发光材质共用一个占位图
实测效果
| 旧版 | 新版 | |
|---|---|---|
| 纹理显存 | 231.65 MB | 130.31 MB(-44%) |
| 解压体积 | 270.06 MB | 168.73 MB(-37%) |
| 下载体积 | 33.50 MB | 32.28 MB |
LilToNonToon Switcher 1.3.1
1.3.1
修复
-
共享遮罩被 PNG 覆盖 ⇒ 整个模型被染青(mirufy 模型实测)
转换器先接好了正确的
.scmask(RGBA32,R/G/B 装自发光、A 装原遮罩),
但紧接着一段无条件代码又把_NTMask.png写了回去 —— 那张 PNG 是 RGB24,
其 R/G/B 是旧版遮罩内容(实测Body_base为(0.001, 1, 1))。
于是自发光相位sd.col.rgb += sd.mask.rgb给整身加了一层青色:
白色物体变青、皮肤变灰蓝,而红色通道恰好正常 ⇒ 眼睛仍然正确。现在用一个标志记住
.scmask是否接上,只有失败时才退回 PNG,并补上SetDirty。 -
同时补上
CHANGELOG.md里 1.3.0 与 1.3.1 的完整条目。
LilToNonToon Switcher 1.3.0
1.3.0
修复(重要)
- 色带对比度为 0 ⇒ 法线贴图完全不可见、模型没有明暗分层:去掉 avgAlbedo 除法与逐通道 min(1)。
开衫实测_ShadowColor=0.771、avgAlbedo=0.529⇒ 商 1.46 被钳成 1 ⇒ 整条色带纯白。 - 自发光形状:改回按贴图是否存在判断。此前按
LIL_FEATURE_*关键字判断,而 lilToon 的功能开关是
multi_compile 关键字、Material.shaderKeywords读不到 ⇒ 误判为「不乘贴图」⇒ 自发光铺满整张脸。 .scmask输出无损 RGBA32:默认 BC7 会把稀疏高对比的发光数据糊开(渲染偏青/洋红)。- 相位去掉
if (_Enable)外壳:SCConstValue会把它折叠成编译期常量 0 ⇒ 相位在生成源码里看得见、
编译后整段消失。 ModuleInstaller引用了已删除的常量 ⇒ error CS0103,整个 Editor 不编译(菜单消失)。package.json描述改为单行:里面若有真实换行,Unity 会报is not valid JSON。
变更
- 移除自建的 Fabric 模块:实测贡献 < 2%;织物纹理由 Shade 色带 + 法线贴图保证
(_BumpMap/_BumpScale现在走 NonToon 正规通道_NormalMap/_NormalScale)。 - 色带「比值忠实化」:除以
阴影色 / 平均底色,并自动把 NonToon 的「亮度」(LightLimit Brightness)
设为同一倍数补回(可在菜单里手改)。 - 加入防重复转换闸:源材质已是 NonToon 时拒绝并警告。
FabricModuleInstaller→ModuleInstaller。
LilToNonToon Switcher 1.2.0
LilToNonToon Switcher 1.2.0 —— 自发光(眼睛高光)完全重做、新增渲染器阴影开关诊断、高级设置默认全 1
[1.2.0] - 2026-10-04
这一版集中修自发光(眼睛高光)与画面观感,并新增了一批「转换时就告诉你哪里不对」的诊断。
以下内容全部是相对上一个版本 1.1.16 的变化。
修复
- 眼睛高光(自发光)完全重做 ✅ —— 此前有多种独立缺陷叠加,导致「无光照场景下眼睛不亮」:
- 源材质
_EmissionMap为空时被误判成「没有自发光」⇒ 直接跳过(lilToon 那里空贴图等于白贴图,形状其实来自_EmissionBlendMask); - 转换顺序颠倒:基础贴图先烘、遮罩后建,而发射贴图是遮罩阶段才写出的 ⇒ 永远读到旧文件;
- 依赖
LIL_FEATURE_EmissionBlendMask关键字,而实测材质的m_ValidKeywords是空的 ⇒ 条件永不成立; - 烘焙里「无需色调校正就直接沿用原贴图」的提前返回挡在合并之前 ⇒ 合并永远不执行。
现在严格按 lilToon 的公式(lil_common_frag.hlsl1819~1861)逐材质烘焙,并在postpixel阶段加算
⇒ 无光照场景下眼睛会正常发光 ✅。
- 源材质
- 自发光不再污染其它材质 ✅ —— 曾经它借用共享遮罩的 R/G/B,而那是全模块共用资源,
导致身上出现洋红/黄块(用户实测「删掉_SharedMask画面就正常」)。现在只有真的烘出内容的材质才保留数据,
其余清零;A 通道照旧承载真遮罩,Lighten / MatCap 等模块不受影响。 - 高光颜色与清晰度 ✅ —— 发光颜色改为按亮度去饱和、并以单通道加算 ⇒ 高光呈中性白(不再偏青/偏紫);
遮罩与发射贴图改为无损、无 mipmap 导入 ⇒ 高光不再发糊。 - 描边 ✅ —— 判定改回「按 shader 变体」,修复头发描边被误关(
_UseOutline在 lilToon 的 shader 里并未被引用,只是面板折叠开关)。 - 阴影色带 ✅ —— 修掉「阴影色/平均基础色 > 1 时整条色带被钳成纯白」造成的画面发平(衣服没有褶皱层次)。
- 开关 ✅ —— 恢复「一次转换 = 一个新开关」,不再复用/追加;圈 abc 出一个、圈 def 再出一个。
新增
- 转换时检查渲染器的阴影开关 ✅ —— Mesh Renderer → 照明 → 「接受阴影」没勾选时,任何着色器都收不到阴影
(表现为脸在阴影里始终很亮),这类问题跟着色器无关、极难定位。现在转换结果里会直接列出具体对象路径。
「投射阴影」为 Off 的也会一并说明(通常是有意为之)。 - 高级设置(色调标定) ✅ —— 色带过渡窗口倍数 / 色带暗端收缩 / 烘焙曝光 / 色调 gamma / 色调增益。
默认全部为 1(= 完全照搬 lilToon,不做任何观感补偿,需要的人自己调);
另有「默认(最忠实)」与「设为拟合值」两个按钮,后者填入对着 lilToon 渲染实测标定的一组值。 - 菜单项
Tools/LilToNonToon Switcher/重新生成 NonToon 着色器✅ —— Shader Core 只在它认为模块文件变化时才重生成,
Unity 在后台运行时常常不及时,导致改了模块相位却看不到效果。现在可手动强制一次。
说明
- 出厂的 5 个高级选项全部为 1,即最忠实档;如果觉得整体偏暗或阴影过重,请在高级设置里自行调整后重新转换。
- 「设为拟合值」按钮里的一组值(窗口 2.6 / 暗端 0.70 / 曝光 1.30)是针对 lilToon 的实际渲染做四分位实测得到的,
仅供需要更接近 lil 观感的人参考,不是默认值。
LilToNonToon Switcher 1.1.16 —— 放宽依赖范围,兼容 NonToon 0.2.0 / Shader Core 0.2.0
[1.1.16] - 2026-10-02
变更
- 放宽依赖范围:
jp.lilxyzw.shadercore/jp.lilxyzw.nontoon由^0.1.5/^0.1.3改成
>=0.1.5/>=0.1.3,com.nontoon.modules改成>=0.1.0✓ ——
否则 NonToon 0.2.0 一发布,本插件就会因为版本冲突装不上 ✗。
兼容性说明
逐文件对比了 NonToon 0.1.3 → 0.2.0 与 Shader Core 0.1.12 → 0.2.0:转换器与织物模块依赖的内部细节都没变 ✓
(phase 钩子、ProjectSettings 白名单 API、SCConstValue 关键字机制、SCShaderImporter 全部一致 ✓),
所以本版代码无变化,只是依赖范围放开。NonToon 0.2.0 的新功能是接入 VRC Light Volumes ✓(对我们无影响 ✓)。
LilToNonToon Switcher 1.1.16
LilToNonToon Switcher 1.1.16 —— 放宽依赖范围,兼容 NonToon 0.2.0 / Shader Core 0.2.0
[1.1.16] - 2026-10-02
变更
- 放宽依赖范围:
jp.lilxyzw.shadercore/jp.lilxyzw.nontoon由^0.1.5/^0.1.3改成
>=0.1.5/>=0.1.3,com.nontoon.modules改成>=0.1.0✓ ——
否则 NonToon 0.2.0 一发布,本插件就会因为版本冲突装不上 ✗。
兼容性说明
逐文件对比了 NonToon 0.1.3 → 0.2.0 与 Shader Core 0.1.12 → 0.2.0:转换器与织物模块依赖的内部细节都没变 ✓
(phase 钩子、ProjectSettings 白名单 API、SCConstValue 关键字机制、SCShaderImporter 全部一致 ✓),
所以本版代码无变化,只是依赖范围放开。NonToon 0.2.0 的新功能是接入 VRC Light Volumes ✓(对我们无影响 ✓)。
LilToNonToon Switcher 1.1.15
LilToNonToon Switcher 1.1.15 —— 织物模块拆分为独立的 NonToon Modules 包
[1.1.15] - 2026-09-17
这一版做了架构调整:把 Shader Core 模块从插件里拆出去,做成独立的模块包。功能不变,但模块可以单独安装使用了。
变更
- 织物/法线细节模块搬到新包
com.nontoon.modules(仓库 NonToon Modules)✓ ——
本插件现在通过 VPM 依赖订阅它(vpmDependencies)✓,插件里不再包含任何 Shader Core 模块文件 ✓; - 转换时会调用模块包的 API 自动勾选织物模块(幂等 ✓,没登记就登记 + 重新生成 NonToon shader ✓);
- 调用的方式是反射 ✓ —— 模块包万一没装,本插件仍能正常编译 ✓,只在转换日志里给一条明确提示 ✓;
- 菜单新增
Tools/LilToNonToon Switcher/打开 NonToon 模块管理✓(跳到模块包的勾选界面 ✓)。
说明
- 升级后请让 VCC/ALCOM 一并安装
com.nontoon.modules(依赖会自动带上 ✓); - 如果之前手动把本插件的
Shaders目录拷进过工程,请删掉那份旧副本 ✗ ——
同一个模块 id 出现两次会被 Shader Core 重复编入 shader 导致编译错误;
模块包的勾选界面发现重复时也会在 Console 里提示该删哪一份 ✓。
模块本身没变
织物模块的算法与默认值同 1.1.14(强度 0.25 ✓、方向 0.35 / -0.5 ✓、软压缩 ✓),只是换了家。
LilToNonToon Switcher 1.1.14
LilToNonToon Switcher 1.1.14 —— 补上「第二层 MatCap」,并修掉模块开关不生效的问题(金饰/装饰终于能对上了)。
一、第二层 MatCap 从来没转过
lilToon 有两层 MatCap:_MatCapTex(第一层)和 _MatCap2ndTex(第二层)。
我们以前只转第一层 ✗ —— 所以走第二层的装饰(帽子的羽毛 / 玫瑰)转换后一直是灰的 ✗。
NonToon 恰好有两个槽 ✓,现在:
第一层(_MatCapTex,模式 0/1/2 → Add、3 → Multiply)→ 占一个槽
第二层(_MatCap2ndTex) → 用剩下那个槽
配套:_MatCap2ndColor × _MatCap2ndBlend 写进对应颜色 ✓、_MatCap2ndBlendMask 按第二层的槽位分配遮罩通道 ✓、
_UseMatCap2nd = 0 时留空 ✓。
二、模块开关「勾着但不生效」
NonToon 的模块开关带 SCConstValue,真正让它生效的是材质上的关键字
<属性名大写>_<值>(MatCap 是 _JP_LILXYZW_NONTOON_MATCAPS_ENABLE_1)。
我们以前只写 _Enable 整数 ✗ —— 表现就是「开关明明勾着,却要手动在 Inspector 里取消再勾一次才亮」✗。
现在整数 + 关键字都写 ✓,并在转换后强制重新导入材质(模块状态需要这次刷新 ✓)。
三、顺带一起修的
- 遮罩通道按实际使用的槽位分配(以前写死
MatCapMultiply✗ → 数据烘进 R、模块读 A ✗,被乘成 ~0),写完还读回校验 ✓ _BumpMap现在同时接到 Details 模块的_Detail0NormalMap(喂sd.N_detail,Shade 模块真的用它算明暗 ✓),
并把四层Detail*Boost钉成 1 ✓(详情层会albedo *= detailTex * boost,boost 不是 1 会整体改亮度 ✗)- 不需要烘焙时
_BaseTexture指回源贴图 ✓(不再残留旧烘焙图 ✓) - 烘焙贴图保持原长宽比 ✓;MatCap 颜色总是写入 ✓
已知限制
- 金属反射:lilToon 的
_UseReflection(_Metallic/_Smoothness/ 环境反射)NonToon 没有对应能力 ✗,
只能近似成高光 —— 「靠反射变金」的部分会比原版偏灰 ✓。 - 织物质感 / 法线细节:NonToon 是 toon 硬色阶 + 硬高光 ✗,法线扰动没有足够的输出通道 ✓ ——
主_NormalMap、Details 的_Detail0NormalMap、调高_NormalScale、降低_Roughness都试过 ✓,
效果都不理想(降低 roughness 反而变塑料 ✗)。要完全一致只能自建 shader / 写模块 ✓。
升级后
ALCOM 更新到 1.1.14 → 重新转换用了 MatCap(尤其是有第二层的)的材质。
安装 / 升级
VCC / ALCOM 仓库地址(总仓库,本插件与 NonToon Light Limit 都在这份索引里):
https://njsgdd10086.github.io/vpm-listing/index.json
LilToNonToon Switcher 1.1.13
LilToNonToon Switcher 1.1.13 —— 修掉「白金色服装的金饰变成灰色」(MatCap / 金属质感整片失效)。
三个叠加的原因
1. Shader Core 的模块开关要写「关键字」
NonToon 每个模块的开关带 SCConstValue,真正让模块生效的是材质上的关键字
<属性名大写>_<值>(MatCap 就是 _JP_LILXYZW_NONTOON_MATCAPS_ENABLE_1)。
我们以前只写了 _Enable 这个整数、没加关键字 ✗ ——
表现就是「开关明明是勾着的,却要手动在 Inspector 里取消再勾一次才亮」✗。现在两者都写 ✓。
2. MatCap 混合模式理解反了
lilToon 的 lilBlendColor:
0 = Normal(直接用 matcap 颜色替换) 1 = Add 2 = Screen 3 = Multiply
我们以前把 0(Normal)丢进了 Multiply ✗ —— 白布 × 金色 matcap 会算成发灰 ✗。
现在 0/1/2 走 MatCap (Add)(叠加最接近「替换」),只有 3 才用 Multiply,
并清空另一个槽(材质是复用的,上次留在里面的贴图会双重生效)。
3. 遮罩通道与模块读取的通道不一致
MatCap 的遮罩以前写死挂到 MatCapMultiply 模块 ✗,而贴图其实放在 MatCapAdd ✗ →
数据烘进 R 通道、模块却读 A ✗(被乘成 ~0)。现在按实际槽位分配通道,
写回模块并读回校验;同时去掉了第二层 MatCap 的无用遮罩(它没转、却会占通道并改模块通道)。
另外还修了:转换后强制重新导入材质(Shader Core 的模块状态需要刷新)、
不需要烘焙时 _BaseTexture 指回源贴图(不再残留旧烘焙图)、MatCap 颜色总是写入。
已知限制:金属反射
lilToon 的 _UseReflection(_Metallic / _Smoothness / 环境反射)NonToon 没有对应能力,
只能近似成一个高光 —— 所以「靠反射变金」的部分(帽子的羽毛 / 玫瑰花)转换后会比原版偏灰 ✓。
需要完全一致的话,这部分建议保留 lilToon 材质、或手动把 NonToon 的 Specular 调暖 + 降低 Roughness 近似。
升级后
ALCOM 更新到 1.1.13 → 重新转换受影响的材质(用了 MatCap / 金属感的那些)。
安装 / 升级
VCC / ALCOM 仓库地址(总仓库,本插件与 NonToon Light Limit 都在这份索引里):
https://njsgdd10086.github.io/vpm-listing/index.json
LilToNonToon Switcher 1.1.12
LilToNonToon Switcher 1.1.12 —— 加了版本号显示与更新检查。
新增
- 菜单 Tools > LilToNonToon Switcher > 关于与更新检查…
显示当前版本 vX.Y.Z、索引里的最新版本,并提供「检查更新 / 打开发布页」。 - 菜单 Tools > LilToNonToon Switcher > 检查更新 —— 直接检查,有新版会弹窗。
- 设置窗口顶部显示「版本 vX.Y.Z」+「检查更新 / 发布页」按钮。
- 编辑器启动后每天自动检查一次(失败静默;发现新版只在 Console 提示一行)。
检查读的是本仓库的 VPM 索引(就是你在 VCC / ALCOM 里加的那个地址),不用额外设置。
说明一下:Unity 的菜单名是编译期固定的([MenuItem]),所以版本号没法直接写进菜单文字 ——
放在了菜单打开的对话框和设置窗口里。
安装 / 升级
VCC / ALCOM 仓库地址(总仓库,本插件与 NonToon Light Limit 都在这份索引里):
https://njsgdd10086.github.io/vpm-listing/index.json