Files
aibis-dream/Docs/MemoryProcessSpriteShaderNotes.md
T

129 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MemoryProcess Sprite Shader Notes
本文记录 `FixSystem/Memory` 记忆调频表现的结构与维护边界。该系统属于旧版 `FixSystem`,但仍承载佩佩修复场景里的记忆播放、打孔带检索和双滑杆调频表现。
## 相关文件
- `Assets/Scripts/FixSystem/Memory/MemoryProcess.cs`
- `Assets/Scripts/FixSystem/Memory/MemorySlider.cs`
- `Assets/Shader/Shader/MemoryTuningSprite.shader`
- 历史 VolFx profile 参考位于 `Assets/Scenes/VFXtest/`
## 当前结构
记忆图像由两层 `SpriteRenderer` 叠加:
- `memoryFinishedSpriteRenderer`:彩色记忆层。
- `memoryFinishedImageNoColor`:无色底图层。
旧版表现主要依赖 VolFx 后处理。现在调频阶段默认由 `AibisDream/MemoryTuningSprite` 在 sprite 材质上完成。运行时会为两层分别创建材质实例,并把同一组调频参数同步写入两层,避免只扰动彩色层时露出或错开无色底图。
`memoryFinishedImageNoColor` 使用同一个 shader,但通过材质参数保留无色底图观感:
- `_MemoryGrayscale = 1`
- `_MemoryContrast = 1.8`
彩色层保持:
- `_MemoryGrayscale = 0`
- `_MemoryContrast = 1`
## 调频语义
`MemorySlider` 输出的是距离目标值的归一化偏差:
- 越接近目标区间,传出的值越接近 `0`
- 越远离目标区间,传出的值越接近 `1`
因此 shader 表现应遵循“远离目标时混乱,靠近目标时清晰稳定”的方向。
目前两个轴的职责是:
- 频率轴:像素化、颗粒化、焦糊感。
- 清晰度轴:色散、轻微相位错位、弱 UV 扭曲。
后续如果要增强反馈,优先保持两个轴的视觉语义差异,不要让两个轴都只表现为普通模糊。
## 后处理迁移边界
旧 VolFx profile 可以作为视觉参考,但不要直接照搬参数到 sprite shader。原因是后处理作用于最终合成画面,而 sprite shader 只作用于单个 sprite 层。尤其是 UV 扭曲:
- 后处理中的强扭曲通常不会暴露底层。
- sprite 层上的强扭曲会撕开当前层边缘,露出下面的 `nocolor` 层或背景。
因此 sprite shader 中的扭曲应保持较弱,并在 UV 边缘做衰减。
## 旧 VolFx 参考
调频滑杆的历史 profile
- `Assets/Scenes/VFXtest/记忆像素滑块.asset`
- `PixelationVol`
- `BlurVol`
- `Assets/Scenes/VFXtest/记忆清晰度滑块.asset`
- `ChromaticVol`
- `DistortVol`
加载与屏幕类历史 profile
- `Assets/Scenes/VFXtest/花屏.asset`
- 用于放入记忆卡带后的加载花屏。
- 不属于双滑杆调频效果。
- `Assets/Scenes/VFXtest/记忆屏幕.asset`
- 曾用于 `mainEffect` 的默认记忆屏幕后处理。
这些 profile 的用途不同,迁移或复刻时需要先确认当前目标是“调频反馈”、“卡带加载过场”,还是“进入记忆界面的默认屏幕质感”。
## Volume 字段现状
`MemoryProcess` 中仍保留若干 Volume 字段:
- `memoryClarityVolume`
- `memoryFrequencyVolume`
- `memoryProcessVolume`
- `mainEffect`
`useSpriteShaderTuning = true` 时,`memoryClarityVolume``memoryFrequencyVolume` 不再驱动调频表现,只作为后处理模式的兼容入口。
`memoryProcessVolume` 仍可用于放入记忆卡带后的加载花屏,并已做空引用安全处理。
`mainEffect` 曾指向默认记忆屏幕后处理。如果未来要恢复或迁移它,需要先明确是否要作为常驻屏幕质感,而不是误接到卡带加载流程中。
## 常见问题
### sprite 变紫
优先检查 `MemoryTuningSprite.shader` 编译错误。Unity 的紫色材质通常表示 shader 编译失败或材质 shader 丢失。
如果 Unity Console 不方便读取,可以查看:
`%LOCALAPPDATA%\Unity\Editor\Editor.log`
曾经出现过的坑:
- HLSL 局部变量命名为 `line` 会触发 `syntax error: unexpected token 'line'`
- 与 Unity/URP include 中的函数名冲突也可能导致编译失败,工具函数建议使用项目专属前缀。
### nocolor 层露出
通常是彩色层和无色层没有同步应用同一套采样扰动,或 UV 扭曲太强。检查:
- 两层是否都使用运行时材质。
- 调频参数是否同步写入两层。
- 扭曲是否有边缘衰减。
### 调频差异不明显
优先调整 shader 内响应曲线,而不是恢复 VolFx 后处理。可以从以下方向处理:
- 频率轴加强像素密度、模糊半径或响应曲线。
- 清晰度轴加强色散方向、相位错位或轻微漂移。
- 避免把两个轴都调成类似的模糊/噪声效果。
## 维护建议
- 手动编辑 shader 后,及时检查 Unity Console 或 `Editor.log`
- 不要把后处理参数机械映射到 sprite shader。
- 涉及两层记忆图像时,优先考虑两层同步。
- 如果要迁移新的后处理效果,先确认它属于调频、加载过场还是默认屏幕氛围。