概述
CelLookPostProcess 是我的一个开源的 Unity URP 后处理效果,能将 3D 渲染场景转化为卡通/动漫风格的三渲二画面。与常见的逐材质 Toon Shader 方案不同,它采用全屏后处理的方式,以屏幕空间图像特效作用于摄像机完整输出,可以一致地将混合风格场景统一覆盖为同一种风格化效果。
项目核心思想是”快速构建风格化视觉效果”而非抛光到生产级,它不能保持各种极端情况下依旧有不错的、稳定的视觉效果,但它提供的功能面板相对比较多样,能够允许开发者在一定程度内调整和创造效果。
渲染管线:四阶段串联
特效对屏幕画面执行 4 次连续 Blit,每一步都是一层画面处理:
Pass 0: Kuwahara 滤波 → 降噪并保持硬边
↓
Pass 1: 色彩二值化 / 剪影映射 → 色调量化
↓
Pass 2: 漫画描线 → 深度+法线边缘检测
↓
Pass 3: 最终调色 → 色彩校正并与原图混合
Pass 0 — 预处理滤波
在色彩量化之前,先用 Kuwahara 滤波或双边滤波去除噪点和纹理细节。Kuwahara 滤波的特点是在平滑颜色的同时保留硬边,这正是赛璐璐动画干净平整质感的基础。
Pass 1 — 色彩二值化
将画面亮度严格量化为两个层级(亮面/暗面),形成赛璐璐标志性的硬边光影。此外还有一个剪影模式(Silhouette Mode),支持三阶色调映射(高光/中间调/阴影),配合自定义颜色可以得到更具海报化的视觉效果。
Pass 2 — 漫画描线
这是整个特效最核心的视觉识别元素。描线依赖场景的 _CameraDepthTexture 和 _CameraNormalsTexture,同时对深度不连续、法线发散以及亮度边缘三方面做边缘检测,输出漫画风格的轮廓线。线条支持设色、线宽调节,并可通过深度衰减来控制远处线条的淡出程度。
Pass 3 — 最终调色
对上一步输出做饱和度、对比度、阴影色调等全局调整,再将其与原图按可控强度混合输出。
功能全景
参数分为七个逻辑组,共 30+ 可调项:
全局与预滤波
| 参数 | 作用 |
|---|---|
| Effect Intensity | 特效整体混合强度 |
| Stencil Mask | 按 Stencil ID 排除特定物体(如第一人称武器) |
| Pre-Filter Mode | None / Kuwahara / Bilateral |
| Kuwahara Radius | 滤波核心大小 |
| Bilateral Sigma | 双边滤波颜色/空间容差 |
色彩映射
| 参数 | 作用 |
|---|---|
| Use Ramp Map | 切换到自定义渐变贴图映射 |
| Cel Steps / Smooth | 量化色阶数与过渡平滑度 |
| Shadow Threshold | 亮暗分界点与过渡柔和度 |
| Saturation / Contrast | 高光饱和度与整体对比度 |
| Brightness Offset | 整体亮度偏移 |
| Shadow Hue/Sat/Dark | 暗面色相偏移、额外饱和度、压暗程度 |
剪影模式
定义三种自定义颜色(阴影/中间调/高光),通过两个阈值滑条控制色彩分界,适合追求强烈风格化的画面。
漫画描线
| 参数 | 作用 |
|---|---|
| Line Intensity | 全局描线强度(0 禁用) |
| Line Thickness | 线宽(像素) |
| Depth / Normal / Luma Threshold | 三种边缘检测灵敏度 |
| Depth Falloff | 远处线条淡出距离 |
| Line Color | 线条颜色 |
图案阴影(网目贴)
模拟日本漫画的网点纸效果。支持圆点和交叉线条两种图案,可调整密度(scale)、角度、强度以及生成阈值。阴影区域由阈值决定。
屏幕特效
- 像素化:复古像素网格效果
- CRT:屏幕弯曲、色差、扫描线
- Vaporwave:噪声纹理、glitch 频率/速度/撕裂强度、颗粒噪点
预设系统
内置”漫画””卡通”等预设,可在 Volume 组件的下拉菜单中直接切换。自定义预设输入名称保存后,生成 .asset 文件存储于 Assets/CelLookPostProcess/Presets/。运行时预设切换由 CelLookPresetSwitcher 组件实现——挂载到 Volume 所属 GameObject,填充预设数组,按 P 键循环。
架构设计
项目完全接入 Unity URP 原生体系:
Volume Component — 参数由
CelLookSettings(继承自VolumeComponent)承载,天然支持全局/局部 Volume 混合、层级遮罩和平滑过渡。不是自己写的 MonoBehaviour + PostProcessing 桥接,而是 URP 一等公民。Renderer Feature —
CelLookRenderFeature是ScriptableRendererFeature,在BeforeRenderingPostProcessing事件注入自定义ScriptableRenderPass,实现多 Pass Blit 链。描线数据源 — 深度和法线来自 URP 自动生成的
_CameraDepthTexture和_CameraNormalsTexture,需要在 URP Asset 或 Camera 上启用。Inspector —
CelLookSettingsEditor提供自定义面板 UI,包括预设管理按钮和参数分组绘制。
文件目录一览:
Assets/CelLookPostProcess/
├── Shaders/
│ └── CelLookPostProcess.shader
├── Scripts/
│ ├── CelLookSettings.cs
│ ├── CelLookRenderFeature.cs
│ ├── CelLookPreset.cs
│ ├── CelLookPresetAsset.cs
│ └── CelLookPresetSwitcher.cs
├── Editor/
│ └── CelLookSettingsEditor.cs
└── Presets/
└── *.asset
适用场景
屏幕空间方案的决定性取舍在于:通用覆盖换取逐对象控制。它不能像逐材质方案那样对特定角色做差异化 Toon 着色,但换来的好处是零侵入——不需要改任何材质,不需要为每个物体换 Shader,一个 Volume 挂上去就能看到效果。
这使得它特别适用于快速概念验证和风格原型探索以及独立游戏寻求统一风格化视觉。