卡通光照

6 / 17
在简单球体上学习光照项(漫反射/高光/边缘光)。

用 floor 把漫反射连续值切成几个色阶,核心就是这一行:

下面拆解它。


floor 分级的原理

diff 是标准漫反射值,范围 0.0 到 1.0 的连续渐变。

floor(diff * 4.0) 先把范围扩大 4 倍(0 到 4),然后 floor 向下取整,结果只可能是 0、1、2、3 这四个整数。

再除以 3.0 把它缩回 0 到 1,就得到四个离散的亮度档位:0 / 0.33 / 0.67 / 1.0。

这比 if-else 写法更紧凑,调整档位数只需改一个数字。


档位数怎么控制

公式是 floor(diff * N) / (N - 1.0),其中 N 是你想要的档位数:

  • N = 2:只有亮/暗两档,极简漫画风
  • N = 4:四档,当前效果
  • N = 8:八档,接近平滑但有轻微阶梯感

试着改一改

改动效果
4.0 改为 2.03.0 改为 1.0只有两个亮度档,极简卡通
4.0 改为 8.03.0 改为 7.0八个档位,接近平滑渐变
在外面套 pow(diff, 0.5) 再输出亮部更亮,暗部更暗

练习

当前练习区 diff 没有经过 floor 处理,球体是平滑的漫反射渐变,修改 TODO 行,对 diff 做分级处理,让球体呈现出卡通色阶效果。

答案解析

初始状态:diff = max(dot(n, l), 0.0),标准连续漫反射,没有分级。

改动:把 difffloor(diff * 4.0) / 3.0 替换,把 0 到 1 的范围分成四个离散档位。这行代码写在 diff 计算之后、颜色合成之前。

试着把 4.0 / 3.0 改成 3.0 / 2.0(三个档位),感受减少档位后卡通感的变化。

GLSL 代码编辑器

正确代码预览

当前代码预览