Toon Shader 的七条路径:卡通渲染核心实现方案的演进图谱
从阶梯式漫反射到混合渲染管线,七种方案的原理、代价与适用边界
为什么是七条路径而不是一个标准答案
赛璐璐(cel-shading,也称 toon shading)是一种以视觉目标定义的渲染风格,而非以数学模型定义的渲染理论。这一点决定了它从诞生起就没有唯一正确的实现路径。与基于物理的渲染(PBR)不同——PBR 拥有微表面理论、能量守恒、菲涅尔方程这样统一的理论框架,只要参数正确,不同引擎的结果应当趋同;而赛璐璐的目标是"看起来像手绘动画",这是一个美学命题,美学命题没有标准解。
七条路径并非凭空划分。它们分别诞生于不同的硬件时代、服务于不同的美术目标、受制于不同的性能预算。Dreamcast 时代的固定管线逼出了阶梯式离散化;可编程着色器的普及让 Ramp Texture 成为艺术家可控的工具;移动端的算力限制则让背面膨胀描边重新流行。本文把这七种核心方案的原理、代价与适用边界画成一张图谱,供开发者按需取用。
基础三件套:阶梯漫反射、色带贴图与轮廓描边
方案一:阶梯式漫反射
阶梯式漫反射是几乎所有赛璐璐着色器的起点。它的核心思路是:取法线与光照方向的点积 NdotL,这个值原本在 PBR 中会经过平滑的漫反射积分,得到连续的明暗过渡;而在赛璐璐中,我们用阶梯函数把它离散化成有限的几段。比如阈值设在 0.5,则 NdotL 大于 0.5 取亮色,小于则取暗色,中间没有过渡。
可控参数是每一段的阈值与对应的颜色映射。段数越多越接近连续光照,段数越少越像漫画。2000 年 6 月 23 日发售的《Jet Set Radio》是首个商业上引人注目的 3D 赛璐璐游戏,它在 Dreamcast 上使用的就是这种离散化的早期形态,受限于当时硬件,段数极少。
方案二:Ramp Texture 色带贴图
阶梯式的问题是阈值写死在着色器代码里,美术想调整明暗交界的位置就得改代码。Ramp Texture 把这个控制权交还给了美术:用一张一维纹理,以 NdotL 作为 UV 坐标去采样,纹理上每个像素的颜色就是对应光照强度下的最终漫反射色。
美术可以直接在图像编辑器里画出他想要的色带过渡——硬边、软渐变、甚至带高光斑点,都不需要碰一行着色器。这种"数据驱动艺术控制"的思路在 2000 年代中期随着可编程着色器普及而成为主流,至今仍是大多数赛璐璐游戏的首选漫反射方案。
方案三:背面膨胀轮廓线
轮廓线是赛璐璐视觉的另一半。最古老也最可靠的画法是背面膨胀:把网格的背面沿顶点法线方向向外推一定距离,用纯黑渲染,再把正面正常渲染叠在上面,露出的那一圈黑色就是描边。
2002 年的《风之杖》用的是这种方法的成熟版本。它的优点是实现简单、对所有平台友好;缺点是描边宽度会随几何体曲率变化——曲面处线细,平面处线粗,细长结构如手指、天线可能完全得不到描边。这个缺陷直接催生了后世的描边优化方案。
进阶三式:双色调、法线风格化与描边优化
方案四:双色调着色
双色调是阶梯式的极端简化:只保留亮与暗两个颜色,完全取消中间过渡带。它适用于追求极致图形简化的项目,例如某些水墨或版画风格的环境元素。需要警觉的是,对大多数角色渲染而言双色调过于激进,会丢失体积感,更适合用在环境与道具上,而非人物面部。
方案五:法线映射风格化
这是把法线从物理属性变成艺术工具的关键一步。常规法线贴图用于模拟表面凹凸的真实细节;而风格化法线则用手绘或程序化修改过的法线替换原始法线,从而人为决定光如何落在模型上——在不改动几何体的前提下,让脸颊的明暗交界线恰好落在想要的位置。
核心洞察是:在赛璐璐中,法线不是物理量的近似,而是美术笔触的延伸。Arc System Works 在 2014 年的《罪恶装备 Xrd》中把这项技术用到极致,通过逐顶点手动调整法线,让 3D 模型在任何光照角度下都呈现手绘动画般的固定阴影形状。
方案六:屏幕空间描边优化
第三种描边思路是后处理:对深度缓冲或法线缓冲做 Sobel、Laplacian 等边缘检测,在屏幕空间直接描出轮廓。它的优点是与几何体无关,描边宽度恒定,还能检测出内部折痕与材质边界;缺点是在移动端开销偏高,且描边质量依赖屏幕分辨率,低分辨率下会闪烁。
现代优化手段是用自定义模板缓冲(Custom Stencil)标记需要描边的对象,后处理时只对这些区域做边缘检测,从而大幅降低全屏计算成本。
第七条路:混合渲染管线的赛璐璐与 PBR 共存策略
当代最主流的做法是分层渲染:角色走赛璐璐管线,环境走 PBR 管线。《原神》(2020)及大量现代二次元游戏采用的就是这种策略。它的真正难题不在任一一条管线本身,而在于让两种风格看上去属于同一个世界。
常见的解法包括:共享光照方向,使角色与环境的明暗逻辑一致;统一阴影颜色,避免角色阴影与环境阴影色相冲突;以及用基于 LUT 的色彩校正把最终画面统一到同一色调下。
七种方案的技术特征矩阵
| 方案 | 核心原理 | 硬件要求 | 风格控制精度 | 代表作品 |
|---|---|---|---|---|
| 阶梯式漫反射 | NdotL 离散化 | 极低 | 低 | Jet Set Radio (2000) |
| Ramp Texture | 1D 纹理查找 | 低 | 高 | 大多数现代赛璐璐游戏 |
| 背面膨胀描边 | 顶点法线外推 | 低 | 中 | 风之杖 (2002) |
| 双色调着色 | 二值化光照 | 极低 | 低 | 特定风格化项目 |
| 法线风格化 | 修改法线贴图 | 中 | 极高 | 罪恶装备 Xrd (2014) |
| 屏幕空间描边 | 后处理边缘检测 | 中高 | 中 | 原神 (2020) |
| 混合渲染管线 | Cel + PBR 分层 | 高 | 极高 | 原神、蔚蓝档案 |
至今未决的两个路线之争
后处理描边(屏幕空间)还是几何体描边(3D 空间):哪条路径才是赛璐璐的正统实现?
支持后处理的一方认为,描边宽度恒定、能抓内部边缘,才是动画感的来源;支持几何体描边的一方则认为,只有 3D 空间中沿法线外推的描边才能保证轮廓随镜头透视正确变化,屏幕空间描边在广角镜头下会出现"贴纸感"。两派至今没有定论,多数项目实际是混合使用:主轮廓用几何体,细节边缘用后处理。
Ramp Texture 是否应该成为赛璐璐的标准,还是阶梯式离散化仍有不可替代的价值?
主流观点认为 Ramp Texture 在美术可控性上全面胜出,理应成为标准。但坚持阶梯式的一方指出,硬编码的阶梯在低端硬件上几乎零成本,且其"生硬"的色阶本身正是某些复古风格的追求目标。两者并非替代关系,而是风格光谱的两端。
从七条路径中带走的四件事
本词条的下一步
- 各方案在 Unity Shader Graph 和 Godot 中的具体节点拓扑(计划中)
- 三大技术门派对这七种方案的不同取舍策略(即将上线)
- 移动端赛璐璐的降级预案详细拆解
- 欢迎在议事厅分享你的方案选择与踩坑经验
- GDC 2015: The Technical Art of Guilty Gear Xrd - Junya C. Motomura (Arc System Works) — 法线风格化与多层描边系统的技术解析
- miHoYo GDC 2019: NPR in Genshin Impact 技术分享 — 风格化PBR与混合渲染管线的工业化实践
- Unity Toon Shader 开源项目文档(UniToon、Toony Colors Pro) — 社区实现方案的对照参考
议事厅ROUNDTABLE
本词条尚无置顶观点。史话的议事规则很简单:反驳需要给出可核验的依据,补充需要标明出处, 立场分歧本身会被保留下来写进词条,而不是被删掉。