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,看看高光会变成什么形状。

GLSL 代码编辑器

正确代码预览

当前代码预览