PBR 光照模型中的菲涅尔效应 (Fresnel) 深度解析
前言:为什么“菲涅尔”是 TA 面试的守门员?
我平时研究美术时最喜欢问的一个问题就是:“请解释一下菲涅尔效应,并写出它在游戏引擎中常用的近似公式。”这个问题之所以经典,是因为它连接了美术观察(现象)与底层代码(数学)。 很多候选人能背出“边缘反光变强”,但一旦问到“金属和非金属的 F0 有什么区别?”或者“粗糙度如何影响菲涅尔?”,就会支支吾吾。渲染管线(如 UE 5.5 或 Unity 6 HDRP)中,PBR 早已是标配。理解菲涅尔,是理解“物体为什么看起来真实”的第一步。
1. 通俗理解:从“平静的湖面”说起
不要上来就甩数学公式,先用物理现象建立直觉。
核心现象: 视线与表面的夹角越小(越平行),反射越强;夹角越大(越垂直),反射越弱。
最经典的例子——湖面:
- 低头看脚下的水面(垂直视角):你是能看到水底的沙石、游鱼的。这时候水主要表现为折射(透射),反射很弱。
- 抬头看远处的湖面(掠射视角):你看不见水底,只能看到倒映的天空和夕阳。这时候水主要表现为镜面反射,反射极强。
这就是菲涅尔效应:反射率不是固定的,它取决于观察角度。
在 PBR 材质中,这意味着:任何物体,哪怕是烂泥巴、黑纸板,在轮廓边缘(Grazing Angle)都有接近 100% 的反光。 很多模型看起来像“塑料”,就是因为没有正确处理这个边缘的高光。

- 图注:左侧展示垂直视角(0°)光线大部分折射入水;右侧展示掠射视角(90°)光线大部分被反射。
- 目的:用物理直觉打底,解释“掠射角”概念。
2. 物理核心:F0 与“金属/非金属”的分野
面试中经常挖的坑在这里:既然所有物体边缘都反光,那为什么金子看起来像金子,塑料看起来像塑料?
这就引入了 $F_0$ (Base Reflectivity) 的概念。 $F_0$ 指的是:当视线垂直于表面(0度角)时的基础反射率。
非金属 (Dielectrics)
- 特征:绝缘体(塑料、木头、皮肤、水)。
- $F_0$ 数值:非常低且稳定,通常在 0.02 ~ 0.05 之间(线性空间)。
- 颜色:非金属的镜面反射是没有颜色的(白光照上去,反回来还是白光)。
- 面试金句:“在 Shader 中,非金属的 Specular Color 通常硬编码为 0.04。”
金属 (Conductors)
- 特征:导体(金、银、铜)。
- $F_0$ 数值:非常高,通常在 0.5 ~ 1.0 之间。
- 颜色:金属的反射带有颜色(金子反射黄色,铜反射橙色)。金属没有漫反射(Diffuse 为黑),它看起来的颜色全靠反射。
| 材质类型 | F0 (Linear) | F0 颜色 | 边缘反射 (F90) |
|---|---|---|---|
| 水 (Water) | 0.02 | 无色 | 1.0 (100%) |
| 塑料 (Plastic) | 0.04 | 无色 | 1.0 (100%) |
| 黄金 (Gold) | 1.0, 0.76, 0.33 | 黄色 | 1.0 (100%) |
| 银 (Silver) | 0.97, 0.96, 0.96 | 银白色 | 1.0 (100%) |

- 图注:一张色谱图,展示了从非金属的深灰色(0.04)跨越到金属的高饱和度颜色(Gold/Copper)。
- 目的:强调 PBR 流程中 BaseColor 与 Metallic 通道的配合逻辑。
3. 数学公式:Schlick 近似 (Schlick's Approximation)
这是 TA 面试的必考题。完整的菲涅尔方程极其复杂(涉及复折射率),在游戏渲染中,我们使用的是 Christophe Schlick 在 1994 年提出的近似公式。

// HLSL 代码片段
float3 FresnelSchlick(float cosTheta, float3 F0)
{
// Pow 5 是为了模拟那个陡峭的边缘曲线
// clamp 是为了防止 cosTheta 越界
return F0 + (1.0 - F0) * pow(1.0 - clamp(cosTheta, 0.0, 1.0), 5.0);
}
为什么是 5 次方?
你可以尝试在 Shader Graph 里把 5 改成 1 或 2。你会发现反光过渡变得非常“肉”,没有那种只有边缘才亮的感觉。5 次方 是为了让反射率在大部分角度保持 $F_0$ 的水平,只有在接近 90 度时才急剧飙升到 1。

- 图注:X 轴为入射角(0-90度),Y 轴为反射率。曲线展示了从 F0 平缓过渡,最后在 90 度陡峭上升至 1.0 的过程。
- 目的:通过函数图像加深对“5次方”的理解。
4. 进阶考点:粗糙度 (Roughness) 对菲涅尔的影响
如果觉得你基础不错,通常会追问:“如果不光滑,表面很粗糙,菲涅尔效应会有变化吗?”
答案是:有,而且很大。
在微表面理论(Microfacet Theory)中,如果表面极其粗糙(Roughness = 1.0),光线会在微小的凹凸中被多次反弹和遮挡,导致边缘原本应该很强的菲涅尔反射变得“暗淡”和“模糊”。

通俗解释: 如果你是一个完美的镜面球,边缘是 100% 反光。 如果你是一个粗糙的水泥球,边缘的反光会被粗糙度“吃掉”,不会亮得那么刺眼。这叫 Fresnel Dimming。
5. 实战中的避坑指南 (Troubleshooting)
作为 TA,在项目中经常要解决美术的“玄学”问题。以下是几个与菲涅尔相关的常见 Bug,一定要注意避坑:
坑 1:金属看起来像黑洞
- 现象:美术画了一个纯金的材质,但在阴影里看起来是黑色的。
- 原因:金属没有漫反射(Diffuse),全靠反射(Specular)。如果在阴影里,或者没有放置 Reflection Probe(反射探针),金属就没有东西可以反射,自然就是黑的。
- 解法:确保场景有环境光(Skybox/IBL)和反射探针。
坑 2:衣服边缘有奇怪的白边
- 现象:角色衣服材质明明是布料,但在逆光下边缘泛白,像塑料雨衣。
- 原因:布料(Cloth)材质通常需要特殊的 Shader(如 Sheen / Velvet),普通的 PBR Shader 默认有菲涅尔高光,对布料来说太强了。
- 解法:使用专门的 Cloth Shader,或者人为降低该材质的 Specular 强度,甚至使用 Fuzz 项来模拟绒毛的逆光效果。
结语:数学是美术的骨架
菲涅尔效应(Fresnel Effect)是 PBR 流程中“能量守恒”的关键一环。它保证了物体不会反射比入射光更多的能量,也保证了材质在不同角度下的物理真实感。对于想要进阶 TA 的同学,不要只停留在“会连节点”的层面。去推导一遍 Schlick 公式,去观察身边的玻璃杯和金属勺子,理解物理与数学的对应关系。记住:图形学的终极目标,就是用最省钱的数学公式,去欺骗人类的眼睛。
参考资料与延伸阅读:
- LearnOpenGL - PBR Theory - 图形学入门必读圣经。
- Naty Hoffman - Physics and Math of Shading (SIGGRAPH Course) - 迪士尼/动视大佬的硬核物理分享。
- Unreal Engine Documentation - Physical Material - 虚幻引擎对 F0 的定义表。
Tags: #技术美术 #TA面试 #PBR #图形学 #菲涅尔 #Shader #Unity #渲染理论#



