边缘光

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.0mix 里的 t 始终为 0,球体只显示底色,没有亮边。

改动:1.0 - dot(n, v) 让边缘的值接近 1.0,pow(..., 2.0) 让这个效果集中在球体轮廓处,mix 把底色渐变到白色。

试着把指数 2.0 改成 4.0,看边缘光会变得多窄。

GLSL 代码编辑器

正确代码预览

当前代码预览