5 个文件 · 10 层管线 · 40+ 参数 · 单 Pass 全链路 · 拖入即用
将任意 URP 项目的游戏画面实时渲染为老式 CRT 电视的复古视觉效果
仅 5 个独立文件,无外部依赖,放入项目即可工作
CRT/
├── AnalogCRT.shader HLSL 核心 · 10 层管线全部算法
├── CRTVolumeComponent.cs Volume 面板 · 40+ 可调参数
├── CRTRenderPass.cs 渲染 Pass · 参数推送 + Blit
├── CRTRendererFeature.cs Feature · URP 入口 + 相机过滤
└── CRTAnimatorProxy.cs Proxy · Timeline 动画驱动(可选)
CRT效果图.png 效果截图
CRT技术文档.md 完整技术文档
README.md 本文件
⓪ VHS 水波纹抖动
① 信号撕裂故障(分块随机错位 + 边缘安全区保护)
② 画面长宽拉伸(模拟 CRT 宽高比调节)
③ 极坐标扭曲(非线性径向缩放)
④ 桶形畸变(二阶泰勒展开模拟显像管曲面)
⑤ SDF 圆角边框(有符号距离场 + smoothstep 抗锯齿)
⑥ 色差 + 径向模糊 + 电子枪偏移(5 次采样同时完成三种效果)
⑦ 扫描线 + RGB 三色荧光粉点阵(三相位正弦波模拟特丽珑栅格)
⑧ 噪点 + 暗角 + 随机闪白 + 曝光饱和度调色
⑨ 管面曲面玻璃反光(r² 反推球面法线 + Blinn-Phong + 滤色模式)
⑩ 圆角黑边叠加 → 最终输出
| 🏷️ 特性 | 🛠️ 实现 | 💡 亮点 |
|---|---|---|
| 5 采样融合 | 色差 + 径向模糊 + 电子枪偏移合并采样 | 一次采样组完成三种效果 |
| SDF 圆角边框 | 有符号距离场 + smoothstep 抗锯齿 |
任意分辨率像素级完美圆角 |
| RGB 荧光粉 | 三相位正弦波(0° / 120° / 240°) | 物理还原特丽珑 CRT 像素结构 |
| 电子枪偏移 | R / B 通道独立 XY 偏移,精度 0.001px | 模拟三色电子枪物理未校准 |
| 管面反光 | r² 反推球面法线 + Blinn-Phong + 滤色 |
无需额外纹理的逼真玻璃高光 |
将 CRT/ 文件夹整体拷贝到 Unity 项目的 Assets/ 目录下(最终路径为 Assets/CRT/)。
| 步骤 | 操作 |
|---|---|
| a | 在 Project 中找到 URP Renderer 资产(Assets/Settings/ 下,如 URP-HighFidelity-Renderer) |
| b | Inspector → Add Renderer Feature → 选 CRT Analog PostProcess |
| c | 把 AnalogCRT.shader 拖入 Feature 的 m_CRTShader 字段 |
| 步骤 | 操作 |
|---|---|
| a | Hierarchy 右键 → Volume → Global Volume |
| b | Volume 面板 → Add Override → 搜 CRT Analog PostProcess |
| c | 勾选 ☑️ enableEffect → 效果即时生效 ✅ |
📐 展开全部 40+ 参数
| # | 分类 | 参数 | 默认值 |
|---|---|---|---|
| 1 | 形态 | screenStretch |
(1, 1) |
polarDistortion |
0.011 |
||
barrelDistortion |
0.695 |
||
borderRoundness 圆角半径 |
0.05 |
||
borderSmoothness 边缘羽化 |
0.02 |
||
borderColor 边框颜色 |
#000 |
||
enableUVClamp UV 钳制 |
✔️ | ||
| 2 | 过载 | flashIntensity |
0.127 |
flashFrequency |
0.057 |
||
flashDuration |
4.97 |
||
| 3 | 故障 | glitchIntensity |
0.01 |
glitchRGBSplit |
0.009 |
||
glitchTiling |
844.26 |
||
glitchEdgeSafeZone |
-0.1 |
||
staticNoise |
0.008 |
||
| 4 | 衰减 | chromaticAberration |
0.0093 |
radialBlurIntensity |
0.0126 |
||
colorBleed |
2.82 |
||
| 5 | 结构 | scanlineColor |
#000 |
scanlineIntensity |
0.103 |
||
scanlineCount |
520 |
||
shadowMaskIntensity |
0.128 |
||
shadowMaskScale |
1 |
||
shadowMaskContrast |
1.15 |
||
| 6 | 色彩 | vignetteIntensity |
0.451 |
vignetteSmoothness |
1.633 |
||
globalTint |
#FFF |
||
exposure |
0.63 |
||
saturation |
1.158 |
||
| 7 | 复古 | jitterIntensity |
0 |
jitterFrequency |
3 |
||
jitterSpeed |
1 |
||
convergenceR 红枪偏移 |
(0, 0) |
||
convergenceB 蓝枪偏移 |
(0, 0) |
||
tubeGlare 管面反光 |
0 |
| 📄 文件 | 🎯 职责 | ✏️ 什么时候改 |
|---|---|---|
AnalogCRT.shader |
GPU 端全部渲染算法 | 新增 / 修改画面效果 |
CRTVolumeComponent.cs |
Volume 面板参数定义 | 新增参数 / 改默认值 |
CRTRenderPass.cs |
读 Volume → 推 Shader → Blit | 改执行时机 / 传参方式 |
CRTRendererFeature.cs |
URP 入口 + 相机过滤 | 改哪些相机生效 |
CRTAnimatorProxy.cs |
Animation / Timeline 驱动 | 做参数关键帧动画 |
| 项目 | 要求 |
|---|---|
| Unity | 2022.3 LTS+ |
| 管线 | Universal Render Pipeline (URP) |
| 平台 | 全平台(仅纹理采样,无 Compute Shader) |
Q: 加了 Feature 但画面没变化?
检查三件事:① Volume 的 enableEffect 是否勾选 ② Volume 是否覆盖了当前相机 ③ 相机类型是否为 Game / SceneView(Preview 相机不生效)。
Q: 不想让 Scene 视图也显示 CRT 效果?
打开 CRTRendererFeature.cs,删掉 CameraType.SceneView 判断条件即可。
Q: 怎么给参数做关键帧动画?
挂载 CRTAnimatorProxy 到 Volume 对象上 → 右键 Pull 拉取当前参数 → Animation 窗口录制关键帧。
Q: 如何单独关闭某个子效果?
把对应参数拉到底(设为 0)即关闭。例如 glitchIntensity = 0 关撕裂,staticNoise = 0 关噪点。
Q: 性能怎么样?
单 Pass、核心阶段仅 5 次纹理采样,无额外 RT 切换。移动端可用。
