在同一场景中比较 Lambert、Phong、Blinn-Phong 与边缘光效果,理解不同光照模型的视觉差异。
把四种光照方案并排展示在同一张画面,中间的分栏逻辑是:
下面拆解每一栏。
第一栏:Lambert 漫反射
最基础的光照,只有漫反射。表面均匀散射,没有高光。效果稳定,常用于卡通或哑光材质。
第二栏:Phong 高光
用反射向量 r = reflect(-l, n) 和视线 v 的夹角计算高光。高光位置随视角移动而变化。
第三栏:Blinn-Phong 高光
用半向量 h = normalize(l + v) 替代反射向量,计算更高效,高光形状在掠射角时更稳定。相同视觉效果下,Blinn-Phong 的指数通常是 Phong 的 2–4 倍。
第四栏:边缘光
当法线和视线接近垂直时(即球体边缘),1.0 - dot(n, v) 接近 1.0,产生轮廓亮边。没有光源方向参与,纯粹是视角效果。
试着改一改
| 改动 | 效果 |
|---|---|
第三栏指数从 28.0 改为 8.0 | Blinn-Phong 高光变大 |
第四栏指数从 2.5 改为 5.0 | 边缘光更窄更集中 |
第四栏边缘光颜色改为 vec3(1.0, 0.6, 0.3) | 暖色边缘光,像火焰轮廓 |
练习
当前练习区三个高光和边缘光全部为 0.0,只有第一栏有效果,补全三个 TODO,让四个栏都正确显示各自的光照效果。
答案解析
初始状态:三个值都是 0.0,第二到第四栏只有漫反射颜色,没有区别。
改动:
- Phong 高光用
dot(r, v):反射方向和视线对齐程度 - Blinn-Phong 高光用
dot(n, h):法线和半向量对齐程度 - 边缘光用
1.0 - dot(n, v):法线偏离视线越多,边缘光越强
对比两种高光可以注意到:相同视觉效果下,Blinn-Phong 的指数(28)大于 Phong(18)。
试着给边缘光的指数改成 1.5,看看边缘光会扩散到整个球面的哪些区域。