Phong 高光
13 / 17
在简单球体上学习光照项(漫反射/高光/边缘光)。
在漫反射球体上加一个闪光点,核心就是这两行:
下面拆解它。
高光是什么
漫反射模拟粗糙表面的均匀散射,而高光模拟光滑表面的镜面反射:光线打到表面,"弹开"到某个方向,恰好对着你眼睛的那个点会非常亮,就像金属、塑料或水面上的闪光。
reflect 和 dot(r, v) 在做什么
第一步,计算光线从法线"弹开"后的方向:
reflect(-l, n) 的意思是:光线方向取反后,对法线做镜像反射,得到反射光方向 r。
第二步,看反射方向有多对着你(视线方向 v = (0,0,1) 即正对屏幕):
越对齐→值越接近 1.0→高光越亮。
pow 的作用
pow(x, 32.0) 把 x 做 32 次方运算,把接近 1.0 的部分保留,其余快速衰减为 0。指数越大,高光点越小越锐利;指数越小,高光越大越柔和。
32 = 中等光滑(类似喷漆塑料);128+ 类似金属或镜面。
试着改一改
| 改动 | 效果 |
|---|---|
32.0 改为 8.0 | 高光变大变柔和,像哑光材质 |
32.0 改为 128.0 | 高光变小变锐,像金属或镜面 |
高光颜色从 vec3(1.0) 改为 vec3(1.0, 0.8, 0.4) | 高光变成暖金色 |
练习
当前练习区没有高光(spec = 0.0),补全 TODO,计算反射方向 r 并求出 Phong 高光值。
答案解析
初始状态:spec = 0.0,球体只有漫反射,没有闪光点。
改动:先用 reflect(-l, n) 算出光的反射方向,再用 dot(r, v) 判断反射方向和视线有多对齐,最后 pow(..., 32.0) 让高光集中在一个小区域。
试着把指数 32.0 改成 4.0,看看高光会变成什么形状。