Fresnel 效果
12 / 17
在简单球体上学习光照项(漫反射/高光/边缘光)。
让球体边缘比中心更亮,核心就是这一行:
下面拆解它。
Fresnel 是什么
Fresnel(菲涅尔)效应来自物理:光线以较小角度(接近正面)射向水面时,折射多、反射少;以较大角度(掠射,接近水平)射向水面时,反射多。这就是为什么从高处俯视湖面时能看到湖底,从远处水平看去湖面像镜子一样。
在着色器里,我们用这个来模拟:视角越偏(越接近球的边缘),材质越亮或越反光。
dot(n, v) 的含义
v = normalize(0, 0, 1) 是正对屏幕的视线方向。
dot(n, v) 表示法线和视线有多对齐:
- 球体中心(法线正对镜头)→ 接近 1.0
- 球体边缘(法线几乎垂直于视线)→ 接近 0.0
1.0 - dot(n, v) 把它翻转:边缘变大、中心变小。
pow 的作用
pow(..., 5.0) 让效果更集中在边缘——指数越大,亮边越窄越集中;指数越小,Fresnel 扩散到更大范围。
指数 5 是一个常用的近似值,接近玻璃、水等电介质材料的物理行为。
试着改一改
| 改动 | 效果 |
|---|---|
5.0 改为 2.0 | Fresnel 扩散到更大面积,整球更亮 |
5.0 改为 10.0 | Fresnel 极度集中在边缘一圈 |
vec3(1.0) 改为 vec3(0.5, 0.8, 1.0) | 蓝色边缘光,像冰面或水下效果 |
练习
当前练习区 f = 0.0,球体只有暗底色没有 Fresnel 边缘光,补全 TODO,让球体边缘产生白色发光效果。
答案解析
初始状态:f = 0.0,球体颜色是 baseCol * 0.2,只有 20% 的暗底,没有边缘亮度。
改动:1.0 - dot(n, v) 让边缘值大、中心值小,pow(..., 5.0) 把这个效果集中到更窄的边缘带。最终 vec3(1.0) * f 加到底色上,边缘变白亮。
试着把指数从 5.0 改成 1.5,看 Fresnel 效果会不会扩散到球体中心区域。