Skip to content

Toon Shader ​

对基础光照模型的一个魔改 —— (老演员 Lambert 和 Blinn–Phong

Lambert 连续漫反射 → Ramp 查表 → 二段或多段光照

Blinn–Phong 连续高光 → Threshold → 硬边高光

漫反射阶段 ​

原本来说,我们使用 BaseColor 乘上漫反射强度得到结果,不过 N→⋅L→ 是一个连续值,所以此处把它色阶化来取得一个简单的风格化效果,简单来说 ——

Ctoon−diffuse​=Cbase​⋅Ramp(N⋅L)

先准备一张由暗到亮但是阶跃的 texture 作为采样的图片,接着把 N·L 作为横坐标,纵坐标为常量进行采样(Clamp 采样方式)

请 G 老师生成了一张简单的示意(仅供参考)

此时就相当于把光照做了个二分 / 多分(看 Ramp Texture 分成几段),而不是连续光照

高光 ​

原先的 Blinn-Phong 计算出的结果是连续值

SpecRaw=pow(N⋅H,SpecPower)

此时把 SpecRaw 做判断,大于阈值的设 1, 小于的设 0,最后再乘上高光颜色得到结果 —— 一个没有“微弱高光”过渡的、硬边缘的高光效果。

UE 相关 ​

毕竟放在 UE 模块下 ——

输入节点 ​

数据UE 节点
表面法线 NPixelNormalWS
人工主光方向 LVector Parameter
观察方向 VCameraVectorWS

数学节点 ​

UE 节点对应运算用途
Normalizenormalize(v)将方向归一化
DotProductdot(a,b)计算 N·L 或 N·H
Saturateclamp(x,0,1)将结果限制到 [0,1]
Adda+b计算 L+V
Powerpow(x,p)控制高光分布
Multiplya*b应用颜色、强度或 Mask(按位乘)
If条件比较将连续高光硬切成 0/1

除此之外

  • Saturate 将输入限制在 [0,1],等价于Clamp(input, 0, 1)
  • OneMinus 等价于 1.0 - input
  • LinearInterpolate 线性插值(Lerp)

Released under the MIT License.