卡通光照
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.0,3.0 改为 1.0 | 只有两个亮度档,极简卡通 |
4.0 改为 8.0,3.0 改为 7.0 | 八个档位,接近平滑渐变 |
在外面套 pow(diff, 0.5) 再输出 | 亮部更亮,暗部更暗 |
练习
当前练习区 diff 没有经过 floor 处理,球体是平滑的漫反射渐变,修改 TODO 行,对 diff 做分级处理,让球体呈现出卡通色阶效果。
答案解析
初始状态:diff = max(dot(n, l), 0.0),标准连续漫反射,没有分级。
改动:把 diff 用 floor(diff * 4.0) / 3.0 替换,把 0 到 1 的范围分成四个离散档位。这行代码写在 diff 计算之后、颜色合成之前。
试着把 4.0 / 3.0 改成 3.0 / 2.0(三个档位),感受减少档位后卡通感的变化。