Skip to content

Toon Shader

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

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

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

漫反射阶段

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

Ctoondiffuse=CbaseRamp(NL)

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

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

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

高光

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

SpecRaw=pow(NH,SpecPower)

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

UE 相关

毕竟放在 UE 模块下 ——

输入节点

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

数学节点

UE 节点对应运算用途
Normalizenormalize(v)将方向归一化
DotProductdot(a,b)计算 N·LN·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.