返回

光照模型对比

在同一场景中比较 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.0Blinn-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,看看边缘光会扩散到整个球面的哪些区域。

GLSL 代码编辑器

正确代码预览

当前代码预览