物理基础:光的传播、反射、折射与能量守恒

做光效提取这些年,我越来越觉得——不懂物理,你连瓶颈在哪都找不到。

很多人一上来就调参数、换算法,结果折腾半天,效果还是不对。为什么?因为光的物理规律是绕不过去的。你想想看,如果连光怎么走、怎么反射、能量怎么分配都没搞清楚,那提取出来的东西能准吗?

这一章,我们就从最基础的物理原理说起。别担心,我不会跟你扯麦克斯韦方程组。咱们就聊那些在光效提取实战中真正用得上的东西。

光是怎么传播的?

光在均匀介质里走直线,这个大家都知道。但实际场景中,光会遇到各种介质边界——空气、玻璃、水面、皮肤……每过一次边界,光的路径就会改变。

我习惯把光的传播分成三个阶段来理解:

  • 入射:光从光源出发,到达介质表面
  • 交互:光在表面发生反射、折射或吸收
  • 出射:光离开表面,进入下一个介质或到达观察者

说白了,光效提取的核心就是反向追踪这个过程的逆问题。你看到的每一个像素,背后都藏着一串复杂的物理交互。

关键认知:光效提取不是凭空造光,而是从观测结果反推光源和介质属性。物理模型越准,反推结果越可靠。

反射:不只是镜面那么简单

反射分两种:镜面反射和漫反射。但实际场景中,很少有纯粹的镜面或纯粹的漫反射。

我记得有一次做室内光效提取,墙面明明是哑光漆,但算法怎么都收敛不了。后来发现,那面墙在某个角度下其实有很明显的镜面分量。这就是典型的混合反射。

在计算机图形学里,我们常用BRDF(双向反射分布函数)来描述这种混合行为。简单说,BRDF告诉你:给定入射方向和出射方向,表面会反射多少光。

反射类型 特点 常见场景 提取难度
镜面反射 入射角=出射角,方向性强 镜子、光滑金属、水面 低(但容易过曝)
漫反射 各方向均匀散射 纸张、墙面、布料 中(需要多角度采样)
混合反射 既有镜面峰又有漫反射基底 塑料、油漆、皮肤 高(需要分离两个分量)

实战技巧:做光效提取时,我建议先判断表面是否包含镜面分量。一个简单方法:改变光源角度,如果高光位置跟着移动,那就有镜面成分。这时候别用纯漫反射模型,否则误差会很大。

折射:光穿过去的秘密

折射发生在光从一种介质进入另一种介质的时候。速度变了,方向就偏了。

这里有个关键参数——折射率。空气的折射率约1.0,水约1.33,玻璃约1.5,钻石约2.4。折射率差越大,光偏得越厉害。

我曾经做过一个水下光效提取的项目。一开始用空气中的模型去算,结果完全不对。后来才意识到,水的折射率让光路发生了偏移,相机看到的位置和实际位置差了将近30%。

折射遵循斯涅尔定律:

n₁ · sin(θ₁) = n₂ · sin(θ₂)

其中:
n₁ = 入射介质的折射率
θ₁ = 入射角
n₂ = 折射介质的折射率
θ₂ = 折射角

嗯,公式看着简单,但实际应用时有个坑——全反射。当光从高折射率介质射向低折射率介质,入射角超过临界角时,光就全部反射回去了,没有折射分量。

避坑指南:我曾经在玻璃器皿的光效提取中忽略了全反射,结果提取出的光分布图出现了奇怪的暗区。后来排查了三天才发现,是临界角附近的折射分量被错误地归零了。记住:全反射区域的光信息不是丢失了,而是被反射到了其他方向。

能量守恒:光效提取的底线

光效提取里有一条铁律:入射能量 = 反射能量 + 折射能量 + 吸收能量。

这条规则看似简单,但很多提取算法都在这里翻车。我见过不少论文,模型做得花里胡哨,结果一算总能量,反射+折射+吸收加起来超过了100%。这物理上就不可能。

实际应用中,能量守恒可以帮我们做两件事:

  1. 校验提取结果:如果反推出来的反射率和透射率之和大于1,那算法一定有问题
  2. 约束优化过程:在迭代求解时,把能量守恒作为硬约束,能大幅提高收敛速度

我个人习惯在每次光效提取后,都算一下能量守恒的残差。如果残差超过5%,我就会回去检查模型或数据。这个习惯帮我排过不少雷。

知识结构总览

下面这张图把本章的核心知识点串起来了。你可以把它当作后续实战的物理导航图。

光效提取的物理基础 光 传播 反射 折射 直线传播 介质影响 镜面反射 漫反射 斯涅尔定律 全反射 能量守恒:入射 = 反射 + 折射 + 吸收 光效提取 = 从观测结果反向求解光源、介质和表面属性的过程

从物理到实战的桥梁

学完这些物理基础,你可能觉得:嗯,道理我都懂,但跟光效提取有什么关系?

关系大了。我给你列几个直接的应用场景:

  • 多视角光效提取:利用反射和折射的几何关系,从不同角度拍摄的图像中反推光源位置
  • 透明物体光效提取:利用折射模型,从背景变形中恢复物体的三维形状和折射率
  • 表面材质提取:利用BRDF模型和能量守恒约束,从多光照图像中分离漫反射和镜面反射分量

说白了,物理模型就是光效提取的骨架。骨架搭对了,后面的算法才能站得稳。

我的建议:开始写代码之前,先花10分钟画一张物理场景的草图。标出光源、物体、相机的位置,画出主要的光路。这一步能帮你避免至少一半的坑。