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.0Fresnel 扩散到更大面积,整球更亮
5.0 改为 10.0Fresnel 极度集中在边缘一圈
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 效果会不会扩散到球体中心区域。

GLSL 代码编辑器

正确代码预览

当前代码预览