物理基础:光的传播、反射、折射与能量守恒
做光效提取这些年,我越来越觉得——不懂物理,你连瓶颈在哪都找不到。
很多人一上来就调参数、换算法,结果折腾半天,效果还是不对。为什么?因为光的物理规律是绕不过去的。你想想看,如果连光怎么走、怎么反射、能量怎么分配都没搞清楚,那提取出来的东西能准吗?
这一章,我们就从最基础的物理原理说起。别担心,我不会跟你扯麦克斯韦方程组。咱们就聊那些在光效提取实战中真正用得上的东西。
光是怎么传播的?
光在均匀介质里走直线,这个大家都知道。但实际场景中,光会遇到各种介质边界——空气、玻璃、水面、皮肤……每过一次边界,光的路径就会改变。
我习惯把光的传播分成三个阶段来理解:
- 入射:光从光源出发,到达介质表面
- 交互:光在表面发生反射、折射或吸收
- 出射:光离开表面,进入下一个介质或到达观察者
说白了,光效提取的核心就是反向追踪这个过程的逆问题。你看到的每一个像素,背后都藏着一串复杂的物理交互。
关键认知:光效提取不是凭空造光,而是从观测结果反推光源和介质属性。物理模型越准,反推结果越可靠。
反射:不只是镜面那么简单
反射分两种:镜面反射和漫反射。但实际场景中,很少有纯粹的镜面或纯粹的漫反射。
我记得有一次做室内光效提取,墙面明明是哑光漆,但算法怎么都收敛不了。后来发现,那面墙在某个角度下其实有很明显的镜面分量。这就是典型的混合反射。
在计算机图形学里,我们常用BRDF(双向反射分布函数)来描述这种混合行为。简单说,BRDF告诉你:给定入射方向和出射方向,表面会反射多少光。
| 反射类型 | 特点 | 常见场景 | 提取难度 |
|---|---|---|---|
| 镜面反射 | 入射角=出射角,方向性强 | 镜子、光滑金属、水面 | 低(但容易过曝) |
| 漫反射 | 各方向均匀散射 | 纸张、墙面、布料 | 中(需要多角度采样) |
| 混合反射 | 既有镜面峰又有漫反射基底 | 塑料、油漆、皮肤 | 高(需要分离两个分量) |
实战技巧:做光效提取时,我建议先判断表面是否包含镜面分量。一个简单方法:改变光源角度,如果高光位置跟着移动,那就有镜面成分。这时候别用纯漫反射模型,否则误差会很大。
折射:光穿过去的秘密
折射发生在光从一种介质进入另一种介质的时候。速度变了,方向就偏了。
这里有个关键参数——折射率。空气的折射率约1.0,水约1.33,玻璃约1.5,钻石约2.4。折射率差越大,光偏得越厉害。
我曾经做过一个水下光效提取的项目。一开始用空气中的模型去算,结果完全不对。后来才意识到,水的折射率让光路发生了偏移,相机看到的位置和实际位置差了将近30%。
折射遵循斯涅尔定律:
n₁ · sin(θ₁) = n₂ · sin(θ₂)
其中:
n₁ = 入射介质的折射率
θ₁ = 入射角
n₂ = 折射介质的折射率
θ₂ = 折射角
嗯,公式看着简单,但实际应用时有个坑——全反射。当光从高折射率介质射向低折射率介质,入射角超过临界角时,光就全部反射回去了,没有折射分量。
避坑指南:我曾经在玻璃器皿的光效提取中忽略了全反射,结果提取出的光分布图出现了奇怪的暗区。后来排查了三天才发现,是临界角附近的折射分量被错误地归零了。记住:全反射区域的光信息不是丢失了,而是被反射到了其他方向。
能量守恒:光效提取的底线
光效提取里有一条铁律:入射能量 = 反射能量 + 折射能量 + 吸收能量。
这条规则看似简单,但很多提取算法都在这里翻车。我见过不少论文,模型做得花里胡哨,结果一算总能量,反射+折射+吸收加起来超过了100%。这物理上就不可能。
实际应用中,能量守恒可以帮我们做两件事:
- 校验提取结果:如果反推出来的反射率和透射率之和大于1,那算法一定有问题
- 约束优化过程:在迭代求解时,把能量守恒作为硬约束,能大幅提高收敛速度
我个人习惯在每次光效提取后,都算一下能量守恒的残差。如果残差超过5%,我就会回去检查模型或数据。这个习惯帮我排过不少雷。
知识结构总览
下面这张图把本章的核心知识点串起来了。你可以把它当作后续实战的物理导航图。
从物理到实战的桥梁
学完这些物理基础,你可能觉得:嗯,道理我都懂,但跟光效提取有什么关系?
关系大了。我给你列几个直接的应用场景:
- 多视角光效提取:利用反射和折射的几何关系,从不同角度拍摄的图像中反推光源位置
- 透明物体光效提取:利用折射模型,从背景变形中恢复物体的三维形状和折射率
- 表面材质提取:利用BRDF模型和能量守恒约束,从多光照图像中分离漫反射和镜面反射分量
说白了,物理模型就是光效提取的骨架。骨架搭对了,后面的算法才能站得稳。
我的建议:开始写代码之前,先花10分钟画一张物理场景的草图。标出光源、物体、相机的位置,画出主要的光路。这一步能帮你避免至少一半的坑。