diff --git a/CLAUDE.md b/CLAUDE.md index c4bef89..6952118 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,16 +22,34 @@ Game assets are encrypted. Key files: **Bundle decryption** (`UmaAssetBundleStream.cs`): header (first 256 bytes) is plain; bytes ≥256 are XOR'd with `FKey = ABKey[i] XOR bundleKey_bytes[j]`. -**meta DB decryption**: `UmaDatabaseController.ReadMetaFromEncryptedDb()` uses `sqlite3mc_x64.dll` with cipher=3 (ChaCha20). Final key = `DBKey[i] XOR DBBaseKey[i % 13]`. A decrypted copy lives at `C:\Users\riten\Desktop\UmaCrack\meta_plain.db`. +**meta DB decryption**: `UmaDatabaseController.ReadMetaFromEncryptedDb()` uses `sqlite3mc_x64.dll` with cipher=3 (ChaCha20). Final key = `DBKey[i] XOR DBBaseKey[i % 13]`. **Asset bundle paths** (key formats): - Live cutt timelines: `cutt/cutt_son{music_id}/cutt_son{music_id}` - Live effect prefabs: `3d/effect/live/pfb_{effectName}` - Stage prefabs: `3d/env/live/live{bgId}/pfb_env_live{bgId}_controller000` -**Python tools** (`C:\Users\riten\Desktop\UmaCrack\`): -- `dump_meta_cutt.py` — decrypts meta DB → `meta_plain.db`, run with Windows Python -- `read_cutt_effect.py` — loads cutt bundles via UnityPy, dumps WorkSheet field TypeTrees +**Python tools** (`tools/`) — rebuilt 2026-08-04 after the old `UmaCrack\` toolchain was deleted. Run with `~/.venvs/umatools/bin/python3` (needs `UnityPy` + `apsw-sqlite3mc`, **not** plain `apsw`; see `tools/requirements.txt`). + +| Script | Use | +|---|---| +| `uma_common.py` | Library: key constants, `decrypt_bundle_bytes()`, `MetaDb` (path→hash, UnityPy load) | +| `dump_meta.py` | `plain` → `out/meta_plain.db` · `find ` · `info ` (hash, dat path, deps, `[NOT DOWNLOADED]`) · `songs` | +| `dump_bundle.py` | `list` / `tree` / `json` / `save` / `gameobjects`, `--deps` | +| `dump_cutt_typetree.py` | **Authoritative track schema.** `--fields ` · `--tree ` · `--sample ` · `--groups` | +| `scan_live_tracks.py` | All 59 songs → `out/scan_keys.csv`, `scan_groups.csv`, `scan_summary.txt`, `scan.json` (~21 s) | + +Notes: `meta` decrypts via sqlite3mc `PRAGMA cipher='chacha20'` + `PRAGMA hexkey='<64 hex>'` (the `key=x'...'` and `raw:` forms both fail); `VACUUM INTO` re-encrypts the target, so `dump_meta.py plain` copies schema+rows explicitly. + +**Cutt bundles ship full TypeTrees, so field names and keyframe counts from these tools are ground truth.** All 70 worksheets across all 59 songs share one 128-field schema — no version drift. Only `son_camera` and `type_01..type_10` carry the trees; the `cutt_son` prefab and `data` bundles are stripped. + +**Getting a track's real field name without the dump tools** — Unity matches bundle TypeTree fields by name, case-sensitively. A field whose name doesn't match is never populated (it does *not* become null — Unity initialises every serialised `List` to an empty list, so null-vs-empty tells you nothing). To test a candidate name, declare it on `LiveTimelineWorkSheet` and check whether it receives keys: + +```csharp +LiveTimelineWorksheetDiag.Probe(sheet, "candidateFieldName"); +``` + +Unsure about casing? Declare both spellings side by side — only the correct one fills. This is how `WashLightList` (capital W) was confirmed; note upstream katboi01 uses `washLightList`, which never populates. ## Live Timeline Architecture @@ -56,8 +74,62 @@ StageController.cs ← manages stage GameObjects, StageObjectMap **Important:** `LiveTimelineKeyWithInterpolate` already declares `frame`, `attribute`, `interpolateType`, `curve`, `easingType` — do NOT redeclare these in subclasses. +**Stage shader colour channels** (enumerated at runtime via `Shader.GetPropertyType`, confirmed on stage live10149 / song 1177): + +| shader | colour | brightness | other | +|---|---|---|---| +| `Gallop/3D/Live/Stage/DefaultNoAmbient` | `_MulColor0` | `_ColorPower` | | +| `Gallop/3D/Live/Stage/DefaultEnvMapNoAmbient` | `_MulColor0` | `_ColorPower` | `_AddColor`, `_EnvMap` | +| `Gallop/3D/Live/Stage/DefaultTransparentNoAmbient` | `_MulColor0` | `_ColorPower` | `_AmbientColor` | +| `Gallop/3D/Live/Stage/LightBlinkBlend` | `_BlinkLightColor` | `_ColorPower` | `_SrcBlend`/`_DstBlend` | +| `Gallop/3D/Live/Stage/LightBlend` / `LightAdd1` | `_MulColor0`, `_MulColor1` | `_ColorPower`, `_ColorPowerMultiply` | | +| `Gallop/3D/Live/Stage/Laser` | `_MulColor0`, `_MulColor1` | `_ColorPower` | `_RandomValue` | +| `Gallop/3D/Bg/BgMirrorBall` | `_MulColor0` | **(none)** | | +| `Gallop/3D/Live/Stage/StageMirrorBallShine` | (none) | | | +| `Gallop/3D/Live/Stage/StageTransmittedLightMask` | (none) | | `_TransmittedLightMaskScale` | + +**Brightness is a separate channel — do not fold it into the colour.** Write the key's colour to the colour property and its `power` to `_ColorPower`; let the shader combine them. Only fall back to `colour * power` where `_ColorPower` is absent (`BgMirrorBall`). + +Dump any shader's real property table with: + +```python +# tools/, via ~/.venvs/umatools/bin/python3 +env = MetaDb().load("shader") # 499 shaders +pf = obj.read_typetree()["m_ParsedForm"] # m_Name, m_PropInfo.m_Props +``` + +**`_MulColor0` is on every stage shader and is BgColor1's channel; `_AmbientColor` belongs to BgColor2.** They are separate properties on the same shader, so the two tracks must not write the same one. Same naming family as WashLight's `MulColor0` and UVScrollLight's `mulColor1`. + +⚠️ A material's `m_SavedProperties` in the bundle lists properties it no longer has — it retains entries from whatever shader it was authored against. `Material.HasProperty()` asks the *current shader*. Always enumerate the shader, never trust the bundle's saved-property table. + +**Track group names are not always GameObject names.** Four separate silent failures were traced to this in one session, so check the mapping before assuming a track is unimplemented: +- a whitelist filter in the dispatcher dropped 92% of BgColor1's keys (`validBgColorNames`) +- `StageObjectMap` dedupes by name, so a crowd of 66 same-named objects only ever got its first member +- the Object track's `neonsign` is a `_stageObjectUnits` **unit name**, not a GameObject — no object of that name exists +- `ObjectUpdateInfo.OffsetType` was populated by the dispatcher but never read by `StageController`, so `Add`-relative positions were written as absolute + +All four failed silently, with no error. Treat a track that "works" but looks wrong as a routing problem first. + **StageObjectMap:** Stage child GameObjects are indexed by name. Objects whose names match `IsTimelineControlledLight()` (`blinklight`, `spotlight3d`, `_wash_`, `laser`) start `SetActive(false)` — their handlers call `SetActive(true)` when the track fires. All other objects (neonsigns, glow meshes, UV scroll objects, etc.) keep their prefab default state. +## Working rule: no ground truth, no implementation + +Field names, keyframe values and shader property tables are all recoverable from the bundles +(`tools/`), so **verify before you write code** — and when something genuinely cannot be +recovered, leave it unimplemented with a TODO rather than guessing a value. + +Guessing has cost real time in this project: the PostFilm vignette geometry was guessed twice +(full-screen wash, then a huge border) before it turned out the defining shader isn't shipped in +any bundle. `PostFilmRendererFeature._enableRendering` is now `false` for exactly this reason. + +Note the distinction that has caught me out: *"the property exists"* is not *"this field maps to +that property"*. `_ColorPower` is present on the stage shaders, but there is no evidence that +BgColor1's `power` field drives it — so that write was reverted while BlinkLight's was kept +(there the shader `LightBlinkBlend` is named for the track and pairs `_BlinkLightColor` with +`_ColorPower`, which is a much tighter fit). + +Open items and why each is blocked are tracked in `LIVE_TRACKS.md` → 「已知未解问题」. + ## Currently Implemented Tracks | Track | Data class | Notes | @@ -66,7 +138,7 @@ StageController.cs ← manages stage GameObjects, StageObjectMap | CharaMotionSequence | existing | | | Facial / LipSync / FormationOffset | existing | | | GlobalLight (48) | existing | sets rim light shader props on characters | -| BgColor1 | existing | sets toon shader color props on characters (`_CharaColor`, `_ToonDarkColor`, etc.) | +| BgColor1 | existing | **two branches.** Groups named `CharaCenter/CharaLeft/CharaRight/CharaColor` (`LiveTimelineControl.CharaBgColorNames`) → character toon props (`_CharaColor`, `_ToonDarkColor`, …). Every other group name → stage renderers, resolved by walking the whole stage hierarchy for same-named Transforms (`Director.ResolveStageTargets`), writing **`_MulColor0`** via `MaterialPropertyBlock`. | | BgColor2 | existing | sets `_AmbientColor` on stage renderers via `Lerp(color1, color2, value)` | | Transform / Object | existing | handled by `StageController.cs` | | Effect (60) | `LiveTimelineEffectData` | loads prefab from `3d/effect/live/pfb_{name}` | @@ -78,12 +150,16 @@ StageController.cs ← manages stage GameObjects, StageObjectMap | Particle (41) | `LiveTimelineParticleData` | sets ParticleSystem.emission.rateOverTime | | ParticleGroup (42) | `LiveTimelineParticleGroupData` | sets FlickerLightRate | | ChromaticAberration (73) | `LiveTimelineChromaticAberrationData` | URP `ChromaticAberration.intensity` ← `power`;per-channel offset 无法映射 | -| HdrBloom (38) | `LiveTimelineHdrBloomData` | URP `Bloom.intensity/threshold`;字段未经 bundle 确认 | +| HdrBloom (38) | `LiveTimelineHdrBloomData` | **dead code** — 0/58 songs carry data (`hdrBloomKeys` empty in every scan and in the song-1177 dump). Safe to delete. | | ColorCorrection (61) | `LiveTimelineColorCorrectionData` | URP `ColorAdjustments.saturation` + `ColorCurves` RGB;depth/blend curve 无 URP 对应 | -| BlinkLight | `LiveTimelineBlinkLightData` | SetActive + child Light color/intensity from timeline data (56/58 songs) | -| WashLight | `LiveTimelineWashLightData` | SetActive only — RaycastDistance/CameraProjection fields unused (5/58 songs) | +| BlinkLight | `LiveTimelineBlinkLightData` | SetActive + child Light color/intensity (56/58 songs). **Biggest lighting payload by far** — 全语料 19420 keys / 57 songs, and over half are named `*_wash_*` (`wash_truss_a` 147, `wash_truss_b` 147, `wash_ground_a` 51, …). `color1Array` / `LightBlendMode` / `isReverseHueArray` still unused. | +| WashLight | `LiveTimelineWashLightData` | SetActive only (5/58 songs). Low value: real "wash light" output comes from the BlinkLight `*_wash_*` groups above, not this track — song 1177 has just 1 group / 11 keys here. | | Laser | `LiveTimelineLaserData` | SetActive + position/rotation/scale — blink/raycast not implemented (6/58 songs) | ## Track Coverage (from 58-song scan) -All high-priority tracks from the 58-song scan are now implemented. Field definitions are obtained by running `read_cutt_effect.py` to dump the WorkSheet TypeTree from a cutt bundle. +**The pre-2026-08-04 scan data in `LIVE_TRACKS.md` was wrong** and has been re-measured with `tools/`. Two systematic errors: a batch of tracks marked "WorkSheet 无 X 字段" do have the field (`MobControlKeys`, `CyalumeControlKeys`, `nodeScaleList`, `sweatLocatorList`, `monitorCameraPos/LookAtKeys`, `facialNoiseKeys`, `charaMotionNoiseKeys`, …), and a batch marked "全 0 keyframe 空占位" carry thousands of keys (`postFilmKeys`/`postFilm2Keys`/`postFilm3Keys` ≈20 200 keys over 59/59 songs, `radialBlurKeys`, `tiltShiftKeys`, `charaFootLightKeys`, …). Rows tagged ✅实测 are trustworthy; untagged rows are still old data. **Re-verify with `tools/` before acting on any untagged row.** + +Coverage numbers measure **what exists in the bundles**, not what the C# consumes — the two diverge. When a track looks under-powered, check the dispatcher in `AlterUpdate_*` for filters before assuming it's unimplemented (BgColor1 was dropping ~92% of its keys that way). + +**Measuring what a song actually carries**: `LiveTimelineWorksheetDiag.Dump()` is called from `Director.InitializeTimeline()` and logs, per worksheet, every track field with its group names and key counts. Confirmed on song 1177: `worksheetList.Count == 1`, `SheetType == MainLive`, so reading `worksheetList[0]` loses nothing. diff --git a/LIVE_DEV_MAP.md b/LIVE_DEV_MAP.md index cf67dc5..d4923a0 100644 --- a/LIVE_DEV_MAP.md +++ b/LIVE_DEV_MAP.md @@ -44,7 +44,8 @@ Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完 ### MaterialPropertyBlock → Shader | 轨道 | 状态 | 属性 | |------|------|------| -| BgColor1 (8) | ⚠️ | `_CharaColor/_ToonDarkColor/_ToonBrightColor/_OutlineColor/_Saturation`(vertexColorToonPower 等未传) | +| BgColor1 (8) 角色分支 | ⚠️ | `_CharaColor/_ToonDarkColor/_ToonBrightColor/_OutlineColor/_Saturation`;`vertexColorToonPower`/`outlineWidthPower`/`LightBlendMode`/`IsSilhouette` 已填入 UpdateInfo 但 handler 还没用 | +| BgColor1 (8) 舞台分支 | ⚠️ | 2026-08-04 新增。遍历舞台层级按 Transform 名解析 Renderer,写 **`_MulColor0`**(已确认)。`_AmbientColor` 归 BgColor2,别抢 | | GlobalLight (48) | ✅ | 角色 rim light 属性 | | UVScrollLight (46) | ⚠️ | `_MainTex` offset 累积(已修 bug,mulColor 等未用) | @@ -89,10 +90,14 @@ Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完 ### 没 dump 找明白(不知道打哪里) +> dump 工具链已于 2026-08-04 重建(`tools/`),这一类现在可以自己解决: +> `~/.venvs/umatools/bin/python3 tools/dump_cutt_typetree.py --tree <字段名> ` 出结构, +> `--sample <字段名> ` 出第一个真实关键帧的值。 + | 轨道 | 不明白什么 | |------|-----------| -| MonitorControl (10) | `dispID` 0–15 不对应 monitor 材质索引,内容资源路径未知;颜色/UV 控制可先做(★★/58 首)| -| AdditionalLight (82) | 字段未 dump,结构未知(22/58 首)| +| MonitorControl (10) | `dispID` 0–15 不对应 monitor 材质索引,内容资源路径未知;颜色/UV 控制可先做(3911 keys / 55 首)| +| AdditionalLight (82) | 字段结构未知,但 `AdditionalLightList` 确认存在,657 keys / 23 首 → 用 `--tree AdditionalLightList` 即可 dump | ### 可以直接做 @@ -105,16 +110,22 @@ Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完 --- -## 未实现轨道优先级(综合覆盖率 + 难度) +## 未实现轨道优先级 -1. **AdditionalLight (82)** — 22/58 首,先 dump 评估 -2. **Billboard (75)** — 12/58 首,简单 -3. **BgColor1 缺字段** — 58/58 首都有,补全影响所有歌 -4. **LensFlare SetActive (57)** — 45/58 首,先做 enableFlare 这一层 -5. **后处理系列** — 见 `live-shader-todo.md` -6. **MonitorControl 框架 (10)** — 颜色/UV 先做,dispID 留 TODO -7. **LightProjection (74)** — 工程量大 -8. **Environment (58)** — 最复杂,Planar Reflection 从零搭 +完整分级见 `LIVE_TRACKS.md` 末尾「优先级排序」。**2026-08-04 用 `tools/` 全量重测后重排**(59 首全语料,数字是总 keyframe 数): + +1. **BgColor1 (8) 舞台分支** — **43617 keys / 59首**,全语料最大轨道。分发过滤已拆,通道已确认为 `_MulColor0`;剩 `BgBL`/`FollowSpotColor`/`Shadow`/`mob_00` 4 个非物件名的组待定 +2. **BlinkLight (45) 补字段** — **19420 keys / 57首**,灯光线最大权重(含全部 `*_wash_*` 效果) +3. **PostFilm (39)** — **~20200 keys / 59首**(三字段合计),未实现里最大的一块。旧记录说它「全 0 keyframe」是错的 +4. **FacialToon (47)** — 6341 keys / 59首,只差 C# 字段 + handler +5. **PostEffectDOF (13)** — 3879 keys / 59首,URP 有内置 DepthOfField,属路径 A +6. **VolumeLight / SunShafts (37)** — 2048 keys / 58首,字段表齐全,做通后 URP Feature 就有模板 +7. **LightProjection (74)** — 3793 keys / 37首,URP 下 Projector 不工作 +8. **Environment (58)** — 1375 keys / 49首,Planar Reflection 从零搭 + +> Environment 之前排第一,现已后移:它属于「从零搭系统」,而 1、2 属于「数据早就在手但没用上」,性价比高一个量级。 +> +> **旧的 ❌「WorkSheet 无字段」判断多数是错的** —— MobControl / CyalumeControl / NodeScale / SweatLocator / MonitorCameraPos / MonitorCameraLookAt / FacialNoise / CharaMotionNoise 的字段都存在且有数据,它们属于「只差 C# 声明」的第三档,不是被卡住。 --- diff --git a/LIVE_TRACKS.md b/LIVE_TRACKS.md index 47ba37f..261cd17 100644 --- a/LIVE_TRACKS.md +++ b/LIVE_TRACKS.md @@ -8,6 +8,23 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e 数据来源:LiveTimelineDefine.cs 枚举 + WorkSheet CS字段核查 + scan_full.py全量扫描(58首歌,2026-05-07)+ Director/Control代码审查 +> **术语**:下文「WorkSheet 有/无 XXX 字段」指的是**游戏 bundle 的 TypeTree**,不是本仓库的 C# `LiveTimelineWorkSheet` 类。两者是分开的:`postFilmKeys`、`radialBlurKeys`、`tiltShiftKeys`、`flashPlayerKeys`、`charaFootLightKeys`、`MultiLightShadowKeys`、`lightProjectionList`、`postFilm1MultiCameraKeys`、`postEffectDOFKeys` 在 bundle 里有,在 C# 里**都还没声明**。 +> +> **覆盖率数字同理**——「N/58 首」量的是 bundle 里有没有数据,不代表 C# 收得到。分发层的过滤可能让有数据的轨道照样落空(BgColor1 就是如此,见 ID 8)。 +> +> ## ⚠️ 2026-08-04:旧扫描数据不可信,已用新工具全量重测 +> +> `tools/` 下的 dump 工具链已重建(见 `CLAUDE.md`)。cutt bundle 自带完整 TypeTree,**字段名和 keyframe 数是权威的**。全 59 首、70 张 worksheet 共享同一套 schema(128 字段),无版本漂移。 +> +> 重测结果与本文件原有记录冲突严重,**下表中带「✅实测」标记的才是可信数据**,其余未标记的行仍是旧扫描结论,谨慎对待。两类系统性错误: +> +> 1. **「WorkSheet无XXX字段」全部是错的** —— 那些字段都存在,而且多数有大量数据(见 ID 26/27/51/52/59/70/77/84/85/98/99) +> 2. **「全0 keyframe空占位」多数是错的** —— RadialBlur/PostFilm/TiltShift/FlashPlayer/CharaFootLight/MultiLightShadow 实测都有真实数据(见 ID 15/39/63/66/72/83) +> +> 真正确认为空的只有:`hdrBloomKeys`、`other4EyeTrackKeys`、`ScreenCaptureDataList`、`tailMotionDataList`(0/59 首)。 +> +> 复查命令:`~/.venvs/umatools/bin/python3 tools/dump_cutt_typetree.py --fields `;全量表在 `tools/out/scan_summary.txt`。 + **实现状态图例** - ✅ 完整 - ⚠️ 部分实现(有TODO) @@ -28,18 +45,18 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | 2 | CameraLookAt | 主摄像机朝向 | ✅ | — | | 3 | CameraFov | 视野角 | ✅ | — | | 4 | CameraRoll | 摄像机滚转 | ✅ | — | -| 5 | HandShakeCamera | 手持抖动效果 | ❌ | — | +| 5 | HandShakeCamera | 手持抖动效果 | ❌ | ✅实测 `handShakeCameraKeys` 56/59首 / 594 keys | | 6 | Event | 时间轴触发事件 | ❌ | — | | 7 | CharaMotionSequence ★(5) | 角色动作序列切换 | ✅ | — | -| 8 | BgColor1 ★(13) | 角色色调/轮廓/阴影颜色 | ✅ | — | +| 8 | BgColor1 ★(13) | 角色**和舞台物件**的色调/轮廓/阴影颜色 | ⚠️ | 曾误标 ✅。`AlterUpdate_BgColor1` 原本用 `validBgColorNames` 只放行 4 个角色组,其余全丢——实测约 92% 的 key 被丢弃(全语料 43617 keys / 59首,是最大的轨道)。2026-08-04 已拆掉过滤并加舞台分支,**舞台侧写 `_MulColor0`**(运行时枚举 shader 确认,每个舞台 shader 都有;`_AmbientColor` 归 BgColor2,两者是同一 shader 上的独立通道)。song 1177 的 20 组里 16 组已正常写入,仍未解析:`BgBL`(256 keys)、`FollowSpotColor`(16)、`Shadow`(2)、`mob_00`(2) —— 这 4 个不是物件名,疑为全局通道 | | 9 | BgColor2 ★(1) | 背景渐变/环境色(两色混合)【15/58首】 | ✅ | 写含 `_AmbientColor` 属性的舞台材质,颜色 = `Lerp(color1, color2, value)`;color2 恒为白色 | -| 10 | MonitorControl ★(2) | LED舞台屏幕内容控制 | ❌ | — | +| 10 | MonitorControl ★(2) | LED舞台屏幕内容控制 | ❌ | ✅实测 `monitorControlList` **55/59首 / 3911 keys**。**舞台上的黑色大屏就是它没实现导致的**:monitor 材质的 `_MainTex`/`_FadeTex`/`_FilterTex` 三个贴图槽在 bundle 里全未绑定,内容靠运行时喂。字段:`dispID` / `speed` / `outputTextureLabel` / `blendFactor` / `Src·DstBlendMode` / `RenderQueueNo` / `LightImageNo` / `CrossFadeRate` / `FilterTexScale`。**内容资源已定位**:`live/uvmovie/gal_uvmovie__<001..017>`(图片序列,带 `_tex_NN`),另有 `gal_uvmovie__light` 对应 `LightImageNo`。全库 219 个 uvmovie 目录。**但 dispID→资源的映射未解**:song 1177 的 key 是 `dispID=1`,却既没有 `gal_uvmovie_1177_001`,也没有 monitorCamera 数据(`monitorCameraPosKeys` 0 keys),两条路都不通 | | 11 | CameraSwitcher | 切换活动摄像机 | ✅ | — | | 12 | LipSync | 口型同步 | ✅ | — | -| 13 | PostEffectDOF | 景深模糊(单机) | ❌ | — | -| 14 | PostEffectBloomDiffusion | 泛光扩散(单机) | ❌ | — | -| 15 | RadialBlur | 径向运动模糊(单机) | ❌ | WorkSheet有radialBlurKeys字段,58/58首存在但全部0 keyframe(空占位) | -| 16 | CameraLayer | 摄像机渲染层遮罩 | ❌ | — | +| 13 | PostEffectDOF | 景深模糊(单机) | ❌ | ✅实测 `postEffectDOFKeys` **59/59首 / 3879 keys**。URP 有内置 DepthOfField,属路径 A | +| 14 | PostEffectBloomDiffusion | 泛光扩散(单机) | ❌ | ✅实测 `postEffectBloomDiffusionKeys` **59/59首 / 1969 keys** | +| 15 | RadialBlur | 径向运动模糊(单机) | ❌ | ✅实测 `radialBlurKeys` **59/59首 / 1667 keys**(单曲最多95)。旧记录「全部0 keyframe」是错的 | +| 16 | CameraLayer | 摄像机渲染层遮罩 | ❌ | ✅实测 `cameraLayerKeys` **58/59首 / 3306 keys** | | 17 | Projector ★(4) | 舞台投影仪(gobo图案) | ❌ | — | --- @@ -56,10 +73,10 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | 23 | FacialEyeTrack | 眼球追踪目标 | ✅ | — | | 24 | FacialEar | 耳部动画 | ✅ | — | | 25 | FacialEffect | 表情叠加特效 | ✅ | — | -| 26 | FacialNoise | 表情随机扰动 | ❌ | WorkSheet无facialNoiseKeys字段 | -| 27 | CharaMotionNoise | 动作随机扰动 | ❌ | WorkSheet无charaMotionNoiseKeys字段 | +| 26 | FacialNoise | 表情随机扰动 | ❌ | ✅实测 `facialNoiseKeys` **存在**,50/59首 / 127 keys。旧记录「无字段」是错的 | +| 27 | CharaMotionNoise | 动作随机扰动 | ❌ | ✅实测 `charaMotionNoiseKeys` **存在**,**59/59首** / 135 keys。旧记录「无字段」是错的 | | 28 | FormationOffset | 角色队形位置偏移 | ✅ | — | -| 29 | Animation ★(1) | GameObject Animation组件序列 | ❌ | — | +| 29 | Animation ★(1) | GameObject Animation组件序列 | ❌ | ✅实测 `animationList` 39/59首 / 1575 keys(单曲最多218),比 ★(1) 高得多 | | 30 | TextureAnimation | 材质纹理帧动画 | ❌ | — | --- @@ -70,10 +87,10 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e |----|------|------|------|-----| | 31 | Transform | 舞台物件位移/旋转/缩放 | ✅ StageController | — | | 32 | Renderer | 舞台Renderer启用/禁用 | ❌ | — | -| 33 | Object ★(10) | 舞台GameObject激活/隐藏 | ✅ StageController | — | +| 33 | Object ★(10) | 舞台GameObject激活/隐藏**+ 位移** | ✅ StageController | 2026-08-04 修了两个静默失效:① 组名可能是 `_stageObjectUnits` 的**单元名**而非 GameObject 名(live10149 的 `neonsign` 就是 unit,底下挂 3 个子对象;没有任何 GameObject 叫 neonsign,整条轨道此前从不触发,灯牌不会从吊顶降下);② `OffsetType` 字段分发层一直在填但 `UpdateObject` 从不读,`Add` 语义被当绝对坐标写,物件被挪到父物体原点。现按 `Direct`/`Add` 分别处理,`Add` 在物件原始 local TRS 上叠加 | | 34 | Audience ★(12) | 观众人群动画参数 | ❌ | — | -| 35 | Props | 舞台道具激活控制 | ❌ | — | -| 36 | PropsAttach | 角色附着道具 | ❌ | — | +| 35 | Props | 舞台道具激活控制 | ❌ | ✅实测 `propsList` 28/59首 / 1940 keys(单曲最多567) | +| 36 | PropsAttach | 角色附着道具 | ❌ | ✅实测 `propsAttachList` 28/59首 / 298 keys | --- @@ -81,44 +98,44 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | ID | 名称 | 作用 | 状态 | Bug | |----|------|------|------|-----| -| 37 | VolumeLight ★(1) | 体积光/SunShafts | ⚠️🔇 | 无SunShafts组件,仅数据 | -| 38 | HdrBloom | HDR泛光强度/阈值 | ❌ | 全量扫描确认0/58首有数据,不需要实现 | -| 39 | PostFilm | 全屏后期叠加(晕影/颜色/UV电影) | ❌ | WorkSheet有postFilmKeys字段,58/58首存在但全部0 keyframe(空占位) | -| 40 | Fade | 场景淡入淡出 | ❌ | — | +| 37 | VolumeLight ★(1) | 体积光/SunShafts | ⚠️🔇 | 无SunShafts组件,仅数据。✅实测 `volumeLightKeys` **58/59首 / 2048 keys** | +| 38 | HdrBloom | HDR泛光强度/阈值 | ⚠️🔇 | 0/58首有数据,**但已经实现了**(Director 有 handler,走 URP Bloom)→ 是本仓库里的死代码,建议删。song 1177 实测 `hdrBloomKeys` 为空 | +| 39 | PostFilm | 全屏后期叠加(晕影/颜色/UV电影) | ⚠️🔇 | ✅实测三字段全有大量数据:`postFilmKeys` 59/59首6689 keys、`postFilm2Keys` 59/59首**7290 keys**、`postFilm3Keys` 59/59首6240 keys(song 1177 为 100/161/87)。旧记录「全部0 keyframe」是错的。**2026-08-05 已完成数据层**:数据类字段按 TypeTree 顺序重排并补齐 5 个 `BlinkLight*`、新增 `LiveTimelineKeyPostFilmDataList`、WorkSheet 三字段、`AlterUpdate_PostFilm` 分发与插值、`PostFilmUpdateInfo`、`PostFilmRendererFeature` + `Resources/Shaders/PostFilm.shader`。**渲染层默认关闭**(`PostFilmRendererFeature._enableRendering = false`):song 1177 的 100 个 key 全是 Vignette 变体,而 `filmOptionParam`(取值如 (0.2,0.05)/(0,0.05)/(0.2,0.25))的几何语义**无法从资源中还原** —— 游戏自己的 PostFilm shader 不在 `shader` bundle 里(499 个 shader 按名字和属性签名都搜过),应在 app 本体的 resources.assets。要继续做只能对着参考视频标定 Width/Strength 两个系数 | +| 40 | Fade | 场景淡入淡出 | ❌ | ✅实测 `fadeKeys` **59/59首** / 243 keys。量小但覆盖全 | | 41 | Particle ★(3) | 粒子系统发射速率 | ✅ | — | | 42 | ParticleGroup ★(3) | 粒子组闪烁速率(双速率曲线) | ✅ | — | -| 43 | WashLight | 洗光灯 SetActive+颜色亮度 | ⚠️ | RaycastDistance/CameraProjectionSide/MulColor0未使用 | -| 44 | Laser | 激光灯变换+SetActive | ⚠️ | blinkRate/blinkOffset/rotateFollowCamera/RaycastDistance未实现 | -| 45 | BlinkLight ★(9) | 频闪灯亮灭周期/颜色/亮度 | ⚠️ | color1Array/LightBlendMode/isReverseHueArray未使用 | +| 43 | WashLight | 洗光灯 SetActive+颜色亮度 | ⚠️ | RaycastDistance/CameraProjectionSide/MulColor0未使用。**低优先级**:song 1177 仅 1 组 11 keys,真正的"洗光"效果由 ID 45 的 `*_wash_*` 组承担。字段名 `WashLightList`(大写 W)已用 A/B 探针确认;上游 katboi01 写作 `washLightList`,永远填不上,其 WashLightController 是死代码 | +| 44 | Laser | 激光灯变换+SetActive | ⚠️ | blinkRate/blinkOffset/rotateFollowCamera/RaycastDistance未实现。song 1177 该轨道为空 | +| 45 | BlinkLight ★(9) | 频闪灯亮灭周期/颜色/亮度 | ⚠️ | **灯光线最大权重**:全语料 19420 keys / 57首;song 1177 实测 27 组,一半以上组名是 `*_wash_*`。★(9) 是 song 1001 的数字,严重低估。2026-08-04 修:写入属性从 `_Color`(这些 shader 上不存在,写入是空操作,灯全渲染成黑)改为按存在性探测 `_BlinkLightColor`/`_MulColor0`/`_Color`。**仍未解**:`color0Array`/`powerArray` 恒为 10 项(调色板),与 renderer 数(可达 570)无关,灯→槽位的映射规则未逆出,暂统一取第 0 槽;`pattern` 语义未逆出,逐灯相位(U闪→M闪→A闪)未实现;`color1Array`/`LightBlendMode`/`isReverseHueArray` 未用。另注意部分 renderer 用 `StageTransmittedLightMask`/`StageMirrorBallShine`,**shader 里一个 Color 属性都没有**,BlinkLight 点不亮(对应未实现的 95/96 TransmittedLight 轨道) | | 46 | UVScrollLight ★(1) | 材质UV滚动灯光效果 | ⚠️ | mulColor1/ColorType/CharacterIndex等未使用 | -| 47 | FacialToon | 角色卡通着色参数 | ❌ | — | +| 47 | FacialToon | 角色卡通着色参数 | ❌ | ✅实测 `facialToonSet` **59/59首 / 6341 keys**(单曲最多600)。未实现轨道里数据量第二大 | | 48 | GlobalLight ★(2) | 全局光方向/RimLight参数 | ✅ | — | | 49 | GlobalFog ★(1) | 全局雾效(颜色/密度/范围) | ✅ | — | | 50 | LightShafts ★(1) | 光轴/丁达尔效果 | ⚠️🔇 | 无LightShaftsController组件,仅数据 | -| 51 | MonitorCameraPos ★(1) | 舞台监控摄像机位置 | ❌ | WorkSheet无monitorCameraPosKeys字段 | -| 52 | MonitorCameraLookAt ★(1) | 舞台监控摄像机朝向 | ❌ | WorkSheet无monitorCameraLookAtKeys字段 | +| 51 | MonitorCameraPos ★(1) | 舞台监控摄像机位置 | ❌ | ✅实测 `monitorCameraPosKeys` **存在**,34/59首 / 964 keys。旧记录「无字段」是错的。用途推测是 LED 大屏的副摄像机实时画面(IMAG),与 ID 10 配套 | +| 52 | MonitorCameraLookAt ★(1) | 舞台监控摄像机朝向 | ❌ | ✅实测 `monitorCameraLookAtKeys` **存在**,34/59首 / 971 keys。旧记录「无字段」是错的 | | 53 | MultiCameraPos ★(2) | 多机位摄像机位置 | ✅ | — | | 54 | MultiCameraLookAt ★(2) | 多机位摄像机朝向 | ✅ | — | | 55 | EyeCameraPos | 眼部特写摄像机位置 | ❌ | — | | 56 | EyeCameraLookAt | 眼部特写摄像机朝向 | ❌ | — | -| 57 | LensFlare | 镜头光晕【45/58首】 | ❌ | — | -| 58 | Environment ★(1) | 地板镜面反射/水面波纹/阴影/FovShift【48/58首】 | ❌ | 核心是Planar Reflection(第二摄像机→RenderTexture→地板shader),无现成系统则工程量大;水面UV参数和阴影开关可部分实现 | -| 59 | SweatLocator ★(3) | 角色汗珠特效挂点 | ❌ | WorkSheet无sweatLocatorList字段 | +| 57 | LensFlare | 镜头光晕 | ❌ | ✅实测 `lensFlareList` 45/59首 / 993 keys(单曲最多181)。舞台用 `CustomLensFlare` 脚本无源码;可先做 SetActive 层 | +| 58 | Environment ★(1) | 地板镜面反射/水面波纹/阴影/FovShift | ❌ | ✅实测 `environmentDataLists` 49/59首 / 1375 keys。**注意 schema 里另有独立字段 `MirrorReflectionDataList`**,两者不是一回事(上游 katboi01 把它俩混为一谈,按 name 分流)。核心是 Planar Reflection,工程量大 | +| 59 | SweatLocator ★(3) | 角色汗珠特效挂点 | ❌ | ✅实测 `sweatLocatorList` **存在**,32/59首 / 608 keys。旧记录「无字段」是错的 | | 60 | Effect ★(8) | 特效Prefab加载/播放(3d/effect/live/) | ✅ | — | | 61 | ColorCorrection | 色彩校正(饱和度/RGB曲线) | ⚠️ | depthRedCurve/Green/Blue/blendCurve/mode/selective/keyColor/targetColor无URP对应 | | 62 | PreColorCorrection | 前置色彩校正 | ❌ | — | -| 63 | TiltShift | 移轴模糊 | ❌ | WorkSheet有tiltShiftKeys字段,58/58首存在但全部0 keyframe(空占位) | +| 63 | TiltShift | 移轴模糊 | ❌ | ✅实测 `tiltShiftKeys` **58/59首 / 1202 keys**(单曲最多127)。旧记录「全部0 keyframe」是错的 | | 64 | A2U | 内部动作系统参数 | ❌ | 非视觉轨道 | | 65 | A2UConfig | A2U配置 | ❌ | 非视觉轨道 | -| 66 | FlashPlayer | 全屏闪光播放 | ❌ | WorkSheet有flashPlayerKeys字段,58/58首存在但全部0 keyframe(空占位) | -| 67 | Title | 歌曲名字幕显示 | ❌ | — | +| 66 | FlashPlayer | 全屏闪光播放 | ❌ | ✅实测 `flashPlayerKeys` 20/59首 / 50 keys。旧记录「全部0 keyframe」是错的,但确实量小 | +| 67 | Title | 歌曲名字幕显示 | ❌ | ✅实测 `titleKeys` 55/59首 / 137 keys | | 68 | Spotlight3d ★(3) | 3D聚光灯 SetActive+颜色/强度 | ✅ | — | | 69 | CharaNode | 角色骨骼节点位置控制 | ❌ | — | -| 70 | NodeScale ★(2) | 舞台节点缩放 | ❌ | WorkSheet无nodeScaleList字段 | -| 71 | Fluctuation | 画面波动/震颤效果 | ❌ | — | -| 72 | CharaFootLight | 角色脚部补光灯 | ❌ | WorkSheet有charaFootLightKeys字段,58/58首存在但全部0 keyframe(空占位) | +| 70 | NodeScale ★(2) | 舞台节点缩放 | ❌ | ✅实测 `nodeScaleList` **存在**,**57/59首** / 541 keys。旧记录「无字段」是错的,且覆盖率远高于原估计 | +| 71 | Fluctuation | 画面波动/震颤效果 | ❌ | ✅实测 `FluctuationKeys` 51/59首 / 330 keys | +| 72 | CharaFootLight | 角色脚部补光灯 | ❌ | ✅实测 `charaFootLightKeys` **49/59首 / 340 keys**。旧记录「全部0 keyframe」是错的 | | 73 | ChromaticAberration ★(1) | 色差后处理 | ⚠️ | redOffset/greenOffset/blueOffset(通道偏移)无URP内置对应;effectType未使用 | -| 74 | LightProjection ★(18!) | 投影灯(Gobo图案灯)【36/58首】 | ❌ | WorkSheet有lightProjectionList字段;song 1001有18条,高优先级 | +| 74 | LightProjection ★(18!) | 投影灯(Gobo图案灯) | ❌ | ✅实测 `lightProjectionList` **37/59首 / 3793 keys**(单曲最多566)。URP 下 `Projector` 组件不工作,需 DecalProjector 或自写 | | 75 | Billboard | 广告牌(始终面向摄像机的面片)【12/58首】 | ❌ | — | --- @@ -127,8 +144,8 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | ID | 名称 | 作用 | 状态 | Bug | |----|------|------|------|-----| -| 76 | MultiCameraPostFilm ★(2) | 多机位全屏后期叠加【50/58首】 | ❌ | WorkSheet有postFilm1MultiCameraKeys字段 | -| 77 | MultiCameraPostEffectBloomDiffusion ★(2) | 多机位泛光 | ❌ | WorkSheet无对应字段 | +| 76 | MultiCameraPostFilm ★(2) | 多机位全屏后期叠加 | ❌ | ✅实测 `postFilm1MultiCameraKeys` 51/59首 / 708 keys | +| 77 | MultiCameraPostEffectBloomDiffusion ★(2) | 多机位泛光 | ❌ | ✅实测 `postEffectBloomDiffusionMultiCameraKeys` **存在**,49/59首 / 381 keys。旧记录「无字段」是错的 | | 78 | MultiCameraColorCorrection | 多机位色彩校正 | ❌ | — | | 79 | MultiCameraTiltShift | 多机位移轴模糊 | ❌ | — | | 80 | MultiCameraRadialBlur | 多机位径向模糊 | ❌ | — | @@ -141,12 +158,12 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | ID | 名称 | 作用 | 状态 | Bug | |----|------|------|------|-----| | 82 | AdditionalLight | 附加动态光源【22/58首】 | ❌ | — | -| 83 | MultiLightShadow | 多光源阴影 | ❌ | WorkSheet有MultiLightShadowKeys字段,58/58首存在但全部0 keyframe(空占位) | -| 84 | MobControl ★(4) | 观众人群行为/动画控制 | ❌ | WorkSheet无MobControlKeys字段 | -| 85 | CyalumeControl ★(4) | 荧光棒颜色/同步控制 | ❌ | WorkSheet无CyalumeControlKeys;CyalumeController3D.cs存在但未接入时间轴 | +| 83 | MultiLightShadow | 多光源阴影 | ❌ | ✅实测 `MultiLightShadowKeys` 37/59首 / 183 keys。旧记录「全部0 keyframe」是错的 | +| 84 | MobControl ★(4) | 观众人群行为/动画控制 | ❌ | ✅实测 `MobControlKeys` **存在**,32/59首 / **2392 keys**(单曲最多495)。旧记录「无字段」是错的 | +| 85 | CyalumeControl ★(4) | 荧光棒颜色/同步控制 | ❌ | ✅实测 `CyalumeControlKeys` **存在**,33/59首 / **2372 keys**(单曲最多496)。旧记录「无字段」是错的。`CyalumeController3D.cs` 已存在,只差接时间轴 | | 86 | CameraMotion | 摄像机动作曲线轨道 | ❌ | — | | 87 | WaveObject | 波浪变形物体 | ❌ | — | -| 88 | CharaWind | 角色风效(头发/裙摆) | ❌ | — | +| 88 | CharaWind | 角色风效(头发/裙摆) | ❌ | ✅实测 `charaWind` 24/59首 / 744 keys | | 89 | CharaParts | 角色部件显隐控制 | ❌ | — | | 90 | CameraCutNo | 镜头编号标记(元数据) | ❌ | — | | 91 | ToneCurve | 色调曲线(ACES/自定义) | ❌ | — | @@ -156,8 +173,8 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | 95 | TransmittedLight | 透射光(次表面散射) | ❌ | — | | 96 | TransmittedLightMask | 透射光遮罩 | ❌ | — | | 97 | Voice | 语音切换控制 | ❌ | — | -| 98 | LipSyncPatternRange | 口型模式范围定义 | ❌ | WorkSheet无字段 | -| 99 | LipSyncPattern | 口型模式数据 | ❌ | WorkSheet无字段 | +| 98 | LipSyncPatternRange | 口型模式范围定义 | ❌ | ✅实测 `LipSyncPatternRangeKeys` **存在** | +| 99 | LipSyncPattern | 口型模式数据 | ❌ | ✅实测 `LipSyncPatternDataList` **存在** | | 100 | LensDistortion | 镜头桶形/枕形畸变 | ❌ | — | | 101 | CharaNodeOffset | 角色骨骼节点偏移 | ❌ | — | | 102 | TransparentCamera | 透明度摄像机控制 | ❌ | — | @@ -174,6 +191,72 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e | 🔴 Bug(已修)| 1 | | ❌ 未实现 | 72 | -## 未实现轨道优先级排序 +## 已知未解问题(2026-08-05) -LensFlare(57, 45/58首) > LightProjection(74, 36/58首) > AdditionalLight(82, 22/58首) > Billboard(75, 12/58首) > Audience(34, ★12条) > MobControl(84, 4条) > CyalumeControl(85, 4条) > Projector(17, 4条) > MultiCameraPostFilm(76, 50/58首) > NodeScale(70, ★2条) > MonitorControl(10, ★2条) > Animation(29, ★1条) > Environment(58, 48/58首, 需Planar Reflection系统) +按「是否有 ground truth」分类。**缺依据的一律不实现**,代码里保留 TODO 注释而不是猜一个值上去。 + +### 有依据、可以直接做 + +| 问题 | 依据 | +|---|---| +| BlinkLight 调色板槽位映射 | `color0Array`/`powerArray` 恒为 10 项而 renderer 可达 570,映射规则未逆出,暂统一取第 0 槽 | +| BlinkLight `pattern` 语义 | 实测有 0 和 2 两种;相位公式是推测,`pattern != 0` 时按 `cycle * i / N` 错开 | +| BgColor1 剩余 4 组 | `BgBL`(256 keys) / `FollowSpotColor`(16) / `Shadow`(2) / `mob_00`(2) 不是物件名也不是材质名 | +| BgColor1 的 `power` → `_ColorPower`? | `_ColorPower` 属性确实存在,但映射关系无证据,已撤回 | + +### 缺 ground truth,已禁用 + +| 问题 | 为什么查不到 | +|---|---| +| PostFilm 的 `filmOptionParam` 几何语义 | 游戏自己的 PostFilm shader 不在 `shader` bundle(499 个按名字和属性签名都搜过),应在 app 本体 `resources.assets` | +| MonitorControl 的 `dispID` → 资源 | 内容资源族已定位为 `live/uvmovie/gal_uvmovie__`(全库 219 个目录),但 song 1177 只有 `_light` 没有 `_001`,且 `monitorCameraPosKeys` 为 0,两条路都不通 | + +### 与时间轴无关的渲染问题 + +| 现象 | 状态 | +|---|---| +| 舞台地板 `plane_000` / `stage_object_001` / `specular_002` 长期偏亮发白 | **早于本次所有改动就存在**,与 BgColor1/`_ColorPower` 无关,未排查 | +| 小灯泡渲染成黑块 | 用 `StageTransmittedLightMask` / `StageMirrorBallShine`,这两个 shader **没有任何颜色属性**,BlinkLight 点不亮。疑为 URP 移植问题,对应未实现的 95/96 TransmittedLight 轨道 | +| LED 大屏黑屏 | MonitorControl (10) 未实现,见上 | + +--- + +## 优先级排序 + +**2026-08-04 用 `tools/` 全量重测后重排。** 依据 = 实测数据量 × 覆盖率 × 工作性质。 +全量表:`tools/out/scan_summary.txt`。 + +### 第一优先:数据早就在手,只是没用上(性价比最高) + +| 轨道 | 实测数据量 | 难度 | 说明 | +|---|---|---|---| +| **BgColor1 (8) 舞台分支** | **43617 keys / 59首** | ★☆☆~★★☆ | 全语料最大的轨道。分发过滤已拆,剩下确认舞台侧 shader 属性 | +| **BlinkLight (45) 补字段** | **19420 keys / 57首** | ★★☆ | 灯光线最大权重,含全部 `*_wash_*` 效果 | +| Laser (44) / UVScrollLight (46) 补字段 | 2661 keys / 33首 | ★☆☆ | 纯管道 | + +### 第二优先:URP 后处理 Feature(路径见 `live-shader-todo.md`) + +| 轨道 | 实测数据量 | 路径 | +|---|---|---| +| **PostFilm (39)** | **~20200 keys / 59首**(三个字段合计) | B,最大的一块 | +| PostEffectDOF (13) | 3879 keys / 59首 | A(URP 内置 DepthOfField) | +| VolumeLight/SunShafts (37) | 2048 keys / 58首 | B,数据类已有,字段表齐全 | +| PostEffectBloomDiffusion (14) | 1969 keys / 59首 | B | +| RadialBlur (15) | 1667 keys / 59首 | B | +| TiltShift (63) | 1202 keys / 58首 | B | + +### 第三优先:只差 C# 字段声明 + handler(bundle 里数据齐备) + +FacialToon(47, **6341 keys/59首**) > MonitorControl(10, 3911/55首,dispID 语义仍未知) > CameraLayer(16, 3306/58首) > MobControl(84, 2392/32首) > CyalumeControl(85, 2372/33首,`CyalumeController3D.cs` 已存在) > Props(35, 1940/28首) > Animation(29, 1575/39首) > MonitorCameraPos/LookAt(51/52, ~1900/34首) > CharaWind(88, 744/24首) > AdditionalLight(82, 657/23首) > SweatLocator(59, 608/32首) > NodeScale(70, 541/57首) > Fluctuation(71, 330/51首) > CharaFootLight(72, 340/49首) > Fade(40, 243/59首) > Title(67, 137/55首) > FacialNoise(26)/CharaMotionNoise(27) + +### 第四优先:要从零搭渲染系统 ★★★ + +LightProjection(74, 3793/37首,URP 下 Projector 不工作) > Environment(58, 1375/49首,Planar Reflection 整套;注意还有独立的 `MirrorReflectionDataList`) > LensFlare(57, 993/45首,可先做 SetActive 层) + +### 不该做 + +**HdrBloom (38)** —— 0/59 首,却已经实现了,是死代码,建议删。 +其余确认为空:`other4EyeTrackKeys`、`ScreenCaptureDataList`、`tailMotionDataList`。 +A2U / A2UConfig / CameraCutNo —— 非视觉轨道。 + +> 之前「PostFilm 到底有没有数据」的矛盾已解决:**`live-shader-todo.md` 是对的**,本文件旧版记的「全部 0 keyframe」是错的。 diff --git a/live-shader-todo.md b/live-shader-todo.md index d73a05c..1f23419 100644 --- a/live-shader-todo.md +++ b/live-shader-todo.md @@ -2,6 +2,8 @@ 全局开发地图见 `LIVE_DEV_MAP.md`。本文件只覆盖需要 URP 移植的后处理效果。 +> **覆盖率数字已于 2026-08-04 用 `tools/` 全量重测更新**(59 首全语料)。带 ✅实测 的是权威数据。dump 字段结构:`~/.venvs/umatools/bin/python3 tools/dump_cutt_typetree.py --tree <字段名> `。 + --- ## 为什么不能直接用旧方法 @@ -57,19 +59,19 @@ Feature 必须在 `UMAUniversalRenderPipelineAsset_Renderer.asset` 的 Renderer | 优先级 | Track ID | 字段名 | URP 类型 | 覆盖率 | |--------|----------|--------|---------|--------| -| 1 | 73 | `chromaticAberrationList` | `ChromaticAberration` | 22/58 | -| 2 | 61 | `colorCorrectionDataLists` | `ColorAdjustments` + `ColorCurves` | 47/58 | -| 3 | 13 | `postEffectDOFKeys` | `DepthOfField` | — | -| — | 38 | `hdrBloomKeys` | — | 0/58,无需实现 | +| 1 | 73 | `chromaticAberrationList` | `ChromaticAberration` | ✅实测 22/59首 / 487 keys | +| 2 | 61 | `colorCorrectionDataLists` | `ColorAdjustments` + `ColorCurves` | ✅实测 47/59首 / 297 keys | +| 3 | 13 | `postEffectDOFKeys` | `DepthOfField` | ✅实测 **59/59首 / 3879 keys** | +| — | 38 | `hdrBloomKeys` | — | ✅实测 **0/59 确认为空**。但 Director 里已经实现了 → 死代码,建议删 | ### 第二组:自定义 shader,工作量大(路径 B) | 优先级 | Track ID | 字段名 | 覆盖率 | 备注 | |--------|----------|--------|--------|------| -| 4 | 39 | `postFilmKeys` / `postFilm2Keys` / `postFilm3Keys` | 58/58 | 最复杂,优先做 | -| 5 | 37 | `volumeLightKeys` | 57/58 | 数据类已有,shader 需移植 | -| 6 | 15 | `radialBlurKeys` | 58/58(骨架居多)| 大多数曲目值为 0 | -| 7 | 63 | `tiltShiftKeys` | 58/58(骨架居多)| 大多数曲目值为 0 | +| 4 | 39 | `postFilmKeys` / `postFilm2Keys` / `postFilm3Keys` | **59/59** | ✅ 三字段合计 **~20200 keys**,最大的一块。**数据层+分发层已完成,渲染层默认关闭**,原因见下方专节 | +| 5 | 37 | `volumeLightKeys` | **58/59** | 数据类已有,shader 需移植。✅实测 2048 keys | +| 6 | 15 | `radialBlurKeys` | **59/59** | ✅实测 1667 keys(单曲最多95)——**不是骨架**,旧记录错误 | +| 7 | 63 | `tiltShiftKeys` | **58/59** | ✅实测 1202 keys(单曲最多127)——**不是骨架**,旧记录错误 | --- @@ -100,11 +102,42 @@ Feature 必须在 `UMAUniversalRenderPipelineAsset_Renderer.asset` 的 Renderer **Track ID**: 13 **URP 类型**: `UnityEngine.Rendering.Universal.DepthOfField` -字段待 dump。URP DOF 分 Gaussian 和 Bokeh 两种模式,选哪种取决于原版字段。 +✅实测 59/59 首 / 3879 keys。字段用 `tools/dump_cutt_typetree.py --tree postEffectDOFKeys ` dump。URP DOF 分 Gaussian 和 Bokeh 两种模式,选哪种取决于原版字段。 --- -### 4. PostFilm(路径 B,优先) +### 4. PostFilm(路径 B)—— 数据层已通,渲染层卡在缺 ground truth + +**2026-08-05 现状** + +已完成并验证:数据类字段(按 bundle TypeTree 顺序重排 + 补齐 5 个 `BlinkLight*`)、 +`LiveTimelineKeyPostFilmDataList`、WorkSheet 三字段、`AlterUpdate_PostFilm` 分发与插值、 +`PostFilmUpdateInfo`、`PostFilmRendererFeature`、`Assets/Resources/Shaders/PostFilm.shader`。 +song 1177 运行时实测 100 / 161 / 87 keys,与离线 dump 一致。 + +**渲染默认关闭**:`PostFilmRendererFeature._enableRendering = false`。 + +卡点:song 1177 的 100 个 key **全是 Vignette 变体**(VigLerp 60 / VigAdd 39 / VigMul 1), +所以晕影衰减是决定观感的关键,而 `filmOptionParam` 的几何语义还原不出来。实际取值: + + (0, 0.05) (0.05, 0.05) (0.08, 0.05) (0.2, 0.05) + (0.04, 0.17) (0.1, 0.17) (0.2, 0.25) + +`y < x` 的组合排除了「内径/外径」;按「离边缘距离」解释试过两版,一版全屏泛色、一版大边框。 +**游戏自己的 PostFilm shader 不在 `shader` bundle 里** —— 该 bundle 的 499 个 shader +按名字(ImageEffect 家族 34 个,无 PostFilm/Vignette)和按属性签名都搜过, +它应该编在 app 本体的 `resources.assets`,我们拿不到。 + +继续做的唯一路径:对着参考视频找一帧晕影明显的画面,在 Inspector 勾上 `Enable Rendering`, +调 `Vignette Width` / `Vignette Strength` 直到吻合,再把数值写死并注明标定依据。 + +未实现:`depthPower` / `DepthClip`(深度混合)、`layerMode = UVMovie`(图层贴图, +和 MonitorControl 共用 `live/uvmovie/gal_uvmovie__` 资源,寻址规则同样未解)。 + +--- + +### 4b. PostFilm 字段参考(原记录,供实现时查) + **Track ID**: 39(还有 `postFilm2Keys`、`postFilm3Keys`,song 1177 有数据) **数据类**: `LiveTimelineKeyPostFilmData`(`LiveTimelineKeyPostFilmDataList.cs` 已存在) @@ -170,21 +203,21 @@ enable: bool → 启用开关 ### 6. RadialBlur(路径 B) -**Track ID**: 15 | **覆盖**: 58/58 首(骨架居多) +**Track ID**: 15 | **覆盖**: ✅实测 59/59 首 / 1667 keys(**有真实数据,不是骨架**) -字段待 dump。算法:屏幕空间径向模糊,从中心向外方向采样 N 次,`offset = direction × step × i`。 +字段可用 `tools/dump_cutt_typetree.py --tree radialBlurKeys ` dump。算法:屏幕空间径向模糊,从中心向外方向采样 N 次,`offset = direction × step × i`。 -骨架数据居多,先搭 Feature 架子,等有真实数据再调参。 +(原记「骨架数据居多」已被实测推翻,可以直接按真实数据实现。) --- ### 7. TiltShift(路径 B) -**Track ID**: 63 | **覆盖**: 58/58 首(骨架居多) +**Track ID**: 63 | **覆盖**: ✅实测 58/59 首 / 1202 keys(**有真实数据,不是骨架**) -字段待 dump。算法:屏幕中间清晰,上下做高斯模糊,用渐变 mask 混合。 +字段可用 `tools/dump_cutt_typetree.py --tree tiltShiftKeys ` dump。算法:屏幕中间清晰,上下做高斯模糊,用渐变 mask 混合。 -骨架数据居多,优先级最低。 +(原记「骨架数据居多」已被实测推翻。) ---