风格化光照:走出卡通渲染之后
分层阴影是所有人都知道的第一步。真正的个性藏在边缘光和阴影颜色的选择里。
只做分层是不够的
一提到卡通着色,大家首先想到的是把光照强度取整成几个台阶。单靠这一点只会显得廉价,场景看起来不像动画,而像低品质。
真正拉开差距的是这些台阶落在什么颜色上。把阴影推向光的补色而不是黑色,场景会立刻变得像是经过美术指导的。
边缘光拯救剪影
在风格化场景中,因为明暗细节很少,物体容易融进背景。所以边缘光不是装饰,而是功能性工具。
如果按摄像机距离缩放边缘光强度,远处的物体就不会过曝。一个很小的系数就能带来很大差别。
测量它的开销
认为风格化着色器很便宜的假设是错的。多层边缘光、描边和自定义阴影计算可能比 PBR 还贵。
我用 RenderDoc 测量每个着色器变体,并把 GPU 开销写进文档。当美术团队能看到预算时,他们的决策会更好。
half3 ToonShade(half3 albedo, half3 N, half3 L, half3 lightColor)
{
half ndl = dot(N, L) * 0.5h + 0.5h;
half band = floor(ndl * _Steps) / _Steps;
half rim = pow(1.0h - saturate(dot(N, _ViewDir)), _RimPower);
return albedo * lightColor * band + _RimColor * rim;
}
hlslToonLit.hlsl
一致性就是一切
场景中所有材质必须共用同一个光照模型。哪怕只有一个 PBR 物体,也会破坏风格化场景的整体性。
因此我会写一个共享的光照函数,让所有着色器调用它。模型改一次,整个场景跟着变。