边缘光
4 / 17
在简单球体上学习光照项(漫反射/高光/边缘光)。
给球体加一圈亮边,核心就是这一行:
下面拆解它。
边缘光是什么
边缘光(Rim Light)是电影和游戏里常用的打光技巧:在角色背后放一盏灯,让轮廓边缘发出一圈亮光,让角色从背景中"抠"出来,增强立体感。
在着色器里,不需要真的放一盏灯,只用视角方向就能模拟这个效果。
1.0 - dot(n, v) 在做什么
v = normalize(0, 0, 1) 是从屏幕朝向你的视线方向。
dot(n, v) 计算法线和视线的对齐程度:
- 球体中心:法线正对镜头 → 接近 1.0
- 球体边缘:法线几乎侧向 → 接近 0.0
1.0 - dot(n, v) 翻转这个结果:边缘大,中心小。
pow(..., 2.0) 把渐变压缩,让亮边集中在更窄的边缘带上,而不是均匀扩散到整个球。
mix 的作用
mix(a, b, t) 在 a 和 b 之间根据 t 插值:t = 0 是第一个颜色,t = 1 是第二个颜色。这里 rim 在边缘接近 1,所以边缘接近白色;中心 rim 接近 0,保持底色。
试着改一改
| 改动 | 效果 |
|---|---|
2.0 改为 5.0 | 边缘光变窄,只剩极细一圈 |
2.0 改为 0.8 | 边缘光扩散到球体大部分面积 |
vec3(1.0) 改为 vec3(1.0, 0.5, 0.2) | 橙色边缘光 |
练习
当前练习区 rim = 0.0,球体边缘没有亮边,补全 TODO,计算正确的 rim 值让边缘发光。
答案解析
初始状态:rim = 0.0,mix 里的 t 始终为 0,球体只显示底色,没有亮边。
改动:1.0 - dot(n, v) 让边缘的值接近 1.0,pow(..., 2.0) 让这个效果集中在球体轮廓处,mix 把底色渐变到白色。
试着把指数 2.0 改成 4.0,看边缘光会变得多窄。