0、前言
光线追踪的渲染方程:
看起来复杂,其实意思很朴素:
朝眼睛方向出去的光
= 物体自己发出的光 + 从四面八方照过来、经过材质反射后出去的光。
各部分含义:
:朝摄像机方向离开的 Radiance
:物体自己发出的光,比如灯泡
:从某个方向射来的 Radiance
:材质如何反射光,也就是 BRDF,包含漫反射和镜面反射
- cosθ:斜着来的光贡献较少
- 积分:把上方所有入射方向都考虑进去
1、光源的Radiance怎么求
1.1、Radiance 的定义
假设光源表面有一小块微元面积 dA,它朝某个立体角方向 dω,发射出去的功率
Radiance中文名辐射亮度,即表面微元的半球方向上,所有方向的亮度都是相同的
Radiance的微分方程为:
各符号的含义:
:光源发出的 Radiance
:光功率,单位是瓦特
W:光源上的一小块面积
:一小片方向范围,单位是立体角
sr- θ:发光方向与光源表面法线的夹角
- cosθ dA:从该方向看过去的“有效面积”
单位是:
W/(⋅sr)
这里下标 e 表示 emitted,也就是“发射出去的”。
1.2、为什么有一个 cosθ
想象一扇发光的窗户。
正对窗户看,能看到完整的一大块:
观察方向 ---> | 窗户 |
斜着看,窗户看起来变窄了:
观察方向 ---> / 窗户 /
它在这个方向上的有效面积是:
=Acosθ
因此,一小块面积朝一小片方向发出的功率是:
=
(x,ω) cosθ dA dω
即:
发出的功率 = Radiance × 有效面积 × 方向。
这个公式比定义公式更适合直观理解。
1.3、最常见情况:均匀漫射面积光源怎么计算Radiance
现实中的柔光灯、发光面板,在简化模型中经常被当成Lambertian emitter(朗伯发光体)。
它的特点是:
(x,ω) =
也就是:
只要方向在光源正面,Radiance 对所有方向都相同。
这里有一个很容易误解的地方:
“Radiance 相同”不代表朝所有角度发出的总功率相同。
因为实际功率里还有 cosθ:
=
cosθ dA dω
所以:
- 正前方:cos0∘=1,发得最多
- 60 度方向:cos60∘=0.5
- 接近平行:cos90∘=0,几乎不发
1.3.1、单面光源,已知总功率,怎么计算 Radiance
假设有一块面积为 A的均匀面光源:
- 只向正面半球发光
- 总辐射功率为
- 各处亮度相同
- 是朗伯发光体
那么:
这就是渲染里非常常用的公式。
例:
一块面积为:
A=2
的发光面板,只向正面发出:
=100 W
那么它的 Radiance 是:
约等于:
≈ 15.9 W/(
)
因为它是朗伯光源,所以从正面、30 度或60 度方向查询,得到的
都是 15.9。
但是它朝斜方向实际分配的功率会被
减少。
1.3.2、为什么公式里是Pi,不是 2Pi
光源正面的所有方向组成半球,半球的立体角确实是:
但不能直接写成:
这是错误的。
因为不同方向的有效面积= cosθdA,
把整个半球方向的积分后:,不再具体推导
所以 得到
1.3.3、双面光源怎么计算Radiance
如果一个面积光源正反两面都发光,而且总功率是两面加起来的,那么:
1.4、点光源怎么计算Radiance
1.4.1、无半径的点光源
理想点光源面积为零。如果把:
A=0
代入:
结果会变成无穷大。
距离点光源 r 的表面,接收到的 Irradiance 为:
这就是点光源常见的平方反比衰减。
还有一个公式挺重要,可以求无半径点光源到 物体表面的入射,:
E: Irradiance 单位面积上的功率,单位 W/(
)
当然这里其实还要加上
(
为入射光线与 反射面法线的夹角)
那么距离点光源 r 的表面的反射
,
1.4.2、有半径的点(球形)光源
(
只需要考略表面微元的半球方向)