Files
aibis-dream/Docs/MemoryProcessSpriteShaderNotes.md
T

4.8 KiB
Raw Permalink Blame History

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 时,memoryClarityVolumememoryFrequencyVolume 不再驱动调频表现,只作为后处理模式的兼容入口。

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。
  • 涉及两层记忆图像时,优先考虑两层同步。
  • 如果要迁移新的后处理效果,先确认它属于调频、加载过场还是默认屏幕氛围。