一、简介
本文简单的介绍了 Physical Based Rendering, PBR 中的 Lambertian 材质漫反射BRDF公式 f r l a m b e r t i a n = c d i f f π fr_{lambertian}=\frac{c_{diff}}{\pi} frlambertian=πcdiff的推导。
二、漫反射项
根据 渲染方程:
L
o
(
v
)
=
∫
Ω
f
r
(
l
,
v
)
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
(1)
Lo(v) = \int_{\Omega}fr(l,v)Li(l)*(n\cdot l) dl \tag{1}
Lo(v)=∫Ωfr(l,v)Li(l)∗(n⋅l)dl(1)
其中的 BRDF 函数
f
r
(
l
,
v
)
fr(l,v)
fr(l,v) 定义如下:
f
r
(
l
,
v
)
=
k
d
∗
f
r
l
a
m
b
e
r
t
(
l
,
v
)
+
k
s
∗
f
r
s
p
e
c
u
l
a
r
(
l
,
v
)
(2)
fr(l,v) = k_d * fr_{lambert}(l,v) + k_s*fr_{specular}(l,v)\tag{2}
fr(l,v)=kd∗frlambert(l,v)+ks∗frspecular(l,v)(2)
其中
k
d
k_d
kd 为漫反射的比例,
f
r
l
a
m
b
e
r
t
fr_{lambert}
frlambert为漫反射中的 BRDF 函数定义如下:
f
r
l
a
m
b
e
r
t
=
c
d
i
f
f
π
(3)
fr_{lambert} = \frac{c_{diff}}{\pi} \tag{3}
frlambert=πcdiff(3)
其中
c
d
i
f
f
c_{diff}
cdiff 为描述材质属性的漫反射颜⾊(diffuse)
c
d
i
f
f
c_{diff}
cdiff ,或者反照率(albedo)
ρ
\rho
ρ。本文接下来介绍什么是 Lambertian 表面,为什么 Lambertian 材质的漫反射BRDF 公式如公式(3) 所示。
1. Lambert 表面
Lambertian 材质是指那种理想的完全漫反射表面,从任何观察方向看去,它反射的亮度都是一致的。即,不论外界的光照如何,Lambertian 材质满足以下公式:
L
o
(
v
)
=
∫
Ω
f
r
l
a
m
b
e
r
t
i
a
n
(
l
,
v
)
(
n
⋅
l
)
d
l
=
L
o
c
(4)
Lo(v) = \int_{\Omega}fr_{lambertian}(l,v)(n\cdot l)\ dl = Lo_{c} \tag{4}
Lo(v)=∫Ωfrlambertian(l,v)(n⋅l) dl=Loc(4)
不管视线向量
v
v
v 如何变化(需要保证在材质的上半球内),其出射的 radiance
L
o
(
v
)
Lo(v)
Lo(v) 恒等于定值
L
o
c
Lo_{c}
Loc。
2. 漫反射公式解释
2.1 反照率 albedo
Lambertian BRDF 的恒定反射率通常被称为漫反射颜⾊(diffuse)
c
d
i
f
f
c_{diff}
cdiff ,或者反照率(albedo)
ρ
\rho
ρ。反照率
ρ
\rho
ρ描述了目标表面反射的辐射通量
Φ
o
u
t
\Phi_{out}
Φout与入射的辐射通量
Φ
i
n
\Phi_{in}
Φin 之比。定义如下:
c
d
i
f
f
=
ρ
=
Φ
o
u
t
Φ
i
n
(5)
c_{diff} = \rho = \frac{\Phi_{out}}{\Phi_{in}} \tag{5}
cdiff=ρ=ΦinΦout(5)
2.2 能量守恒定律
根据能量守恒定理定律,应该有:
c
d
i
f
f
=
ρ
=
Φ
o
u
t
Φ
i
n
≤
1.0
(6)
c_{diff} = \rho = \frac{\Phi_{out}}{\Phi_{in}} \le 1.0 \tag{6}
cdiff=ρ=ΦinΦout≤1.0(6)
2.3 漫反射 BRDF 函数推导
接下来我们将基于以下假设和定义,推导得到 漫反射 BRDF 的渲染公式(3)。
2.3.1 已知信息
- 漫反射BRDF满足渲染方程: L o ( v ) = ∫ f r l a m b e r t i a n ( l , v ) ∗ L i ( l ) ∗ ( n ⋅ l ) d l Lo(v)=\int{fr_{lambertian}(l,v)*Li(l)*(n\cdot l)\ dl} Lo(v)=∫frlambertian(l,v)∗Li(l)∗(n⋅l) dl。
- 对于 Lambertian 材质, f r l a m b e r t i a n ( l , v ) fr_{lambertian}(l,v) frlambertian(l,v) 与 v v v 和 l l l 无关,即 f r l a m b e r t i a n ( l , v ) fr_{lambertian}(l,v) frlambertian(l,v) 是定值 f r c fr_{c} frc 。那么根据渲染方程,不管如何光照 L i ( l ) Li(l) Li(l) 如何分布,任意出射方向的 L o ( v ) Lo(v) Lo(v) 也都相等。
- 对于 Lambertian 材质,假设其没有自发光,满足能量守恒定理,即: c d i f f = ρ = Φ o u t Φ i n ≤ 1.0 c_{diff} = \rho = \frac{\Phi_{out}}{\Phi_{in}} \le 1.0 cdiff=ρ=ΦinΦout≤1.0。
- 目标表面的入射/出射辐射通量/功率(Radiant flux/Power)
Φ
i
n
\Phi_{in}
Φin、
Φ
o
u
t
\Phi_{out}
Φout 的计算公式如下:
Φ i n t = ∫ Ω L i ( l ) ∗ ( n ⋅ l ) d l d A Φ o u t = ∫ Ω L o ( v ) ∗ ( n ⋅ v ) d v d A \Phi_{int} = \int_{\Omega} Li(l)*(n\cdot l) dl\ dA \\ \Phi_{out} = \int_{\Omega} Lo(v)*(n\cdot v) dv\ dA Φint=∫ΩLi(l)∗(n⋅l)dl dAΦout=∫ΩLo(v)∗(n⋅v)dv dA - 假设目标表面为 Lambertian 材质,即只有漫反射,没有镜面反射也没有自发光。
- 假设目标表面的面积为 A A A。
- 假设目标表面的漫反射颜色(反照率)为 c d i f f c_{diff} cdiff,即 c d i f f = Φ o u t Φ i n c_{diff} = \frac{\Phi_{out}}{\Phi_{in}} cdiff=ΦinΦout。
接下来本文将根据以上已知信息推导目标 BRDF 函数 f r l a m b e r t i a n ( l , v ) = f r c = ? fr_{lambertian}(l,v)=fr_{c}=? frlambertian(l,v)=frc=?:
2.3.2 推导过程
根据辐射通量/功率(Radiant flux/Power)
Φ
\Phi
Φ 的计算公式
Φ
=
∫
Ω
L
(
w
)
∗
(
n
⋅
w
)
d
w
d
A
\Phi = \int_{\Omega} L(w)*(n\cdot w) dw\ dA
Φ=∫ΩL(w)∗(n⋅w)dw dA
可以得到目标表面的总出射辐射通量
Φ
o
u
t
\Phi_{out}
Φout 为
Φ
o
u
t
=
∫
Ω
L
o
(
v
)
∗
(
n
⋅
v
)
d
v
d
A
=
∫
0
2
π
∫
0
π
/
2
L
o
(
v
)
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
θ
d
ϕ
d
A
\Phi_{out} = \int_{\Omega} Lo(v)*(n\cdot v) dv\ dA \\ = \int_{0}^{2\pi} \int_{0}^{\pi/2} Lo(v)*cos(\theta)*sin(\theta) d{\theta}d{\phi}\ dA
Φout=∫ΩLo(v)∗(n⋅v)dv dA=∫02π∫0π/2Lo(v)∗cos(θ)∗sin(θ)dθdϕ dA
又因为对于 Lambertian 材质,任意出射方向的
L
o
(
v
)
Lo(v)
Lo(v) 都相等,并且目标表面的面积为
A
A
A,因此有:
Φ
o
u
t
=
∫
0
2
π
∫
0
π
/
2
L
o
(
v
)
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
θ
d
ϕ
d
A
=
∫
0
2
π
∫
0
π
/
2
L
o
c
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
θ
d
ϕ
d
A
=
L
o
c
∗
∫
0
2
π
∫
0
π
/
2
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
θ
d
ϕ
∗
A
=
L
o
c
∗
π
∗
A
(7)
\Phi_{out} = \int_{0}^{2\pi} \int_{0}^{\pi/2} Lo(v)*cos(\theta)*sin(\theta)\ d{\theta}d{\phi}\ dA \\ = \int_{0}^{2\pi} \int_{0}^{\pi/2} Lo_{c}*cos(\theta)*sin(\theta)\ d{\theta}\ d{\phi}\ dA \\ = Lo_{c} * \int_{0}^{2\pi} \int_{0}^{\pi/2} cos(\theta)*sin(\theta)\ d{\theta}\ d{\phi}\ * A \\ = Lo_{c}*\pi*A \tag{7}
Φout=∫02π∫0π/2Lo(v)∗cos(θ)∗sin(θ) dθdϕ dA=∫02π∫0π/2Loc∗cos(θ)∗sin(θ) dθ dϕ dA=Loc∗∫02π∫0π/2cos(θ)∗sin(θ) dθ dϕ ∗A=Loc∗π∗A(7)
那么
L
o
c
=
Φ
o
u
t
π
∗
A
(8)
Lo_{c} = \frac{\Phi_{out}}{\pi*A} \tag{8}
Loc=π∗AΦout(8)
同理可以得到目标表面的总入射辐射通量
Φ
i
n
\Phi_{in}
Φin为:
Φ
i
n
=
∫
Ω
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
d
A
=
∫
Ω
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
∗
A
(9)
\Phi_{in} = \int_{\Omega} Li(l)*(n\cdot l)\ dl\ dA \\ = \int_{\Omega} Li(l)*(n\cdot l)\ dl * A \tag{9}
Φin=∫ΩLi(l)∗(n⋅l) dl dA=∫ΩLi(l)∗(n⋅l) dl∗A(9)
那么就有:
Φ
i
n
A
=
∫
Ω
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
(10)
\frac{\Phi_{in}}{A} = \int_{\Omega} Li(l)*(n\cdot l)\ dl \tag{10}
AΦin=∫ΩLi(l)∗(n⋅l) dl(10)
根据渲染方程,我们可以得到:
L
o
c
=
L
o
(
v
)
=
∫
Ω
f
r
l
a
m
b
e
r
t
i
a
n
(
l
,
v
)
∗
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
Lo_{c} = Lo(v) = \int_{\Omega} fr_{lambertian}(l,v)*Li(l)*(n\cdot l)\ dl
Loc=Lo(v)=∫Ωfrlambertian(l,v)∗Li(l)∗(n⋅l) dl
因为
f
r
l
a
m
b
e
r
t
i
a
n
(
l
,
v
)
fr_{lambertian}(l,v)
frlambertian(l,v) 为定值
f
r
c
fr_{c}
frc ,那么就有:
L
o
c
=
L
o
(
v
)
=
∫
Ω
f
r
l
a
m
b
e
r
t
i
a
n
(
l
,
v
)
∗
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
=
f
r
c
∗
∫
Ω
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
(11)
Lo_{c} = Lo(v) = \int_{\Omega} fr_{lambertian}(l,v)*Li(l)*(n\cdot l)\ dl \\ = fr_c * \int_{\Omega} Li(l)*(n\cdot l)\ dl \tag{11}
Loc=Lo(v)=∫Ωfrlambertian(l,v)∗Li(l)∗(n⋅l) dl=frc∗∫ΩLi(l)∗(n⋅l) dl(11)
将公式(10)代入公式(11)可以得到:
L
o
c
=
L
o
(
v
)
=
f
r
c
∗
∫
Ω
L
i
(
l
)
∗
(
n
⋅
l
)
d
l
=
f
r
c
∗
Φ
i
n
A
(12)
Lo_{c} = Lo(v) = fr_c * \int_{\Omega} Li(l)*(n\cdot l)\ dl \\ = fr_c * \frac{\Phi_{in}}{A} \tag{12}
Loc=Lo(v)=frc∗∫ΩLi(l)∗(n⋅l) dl=frc∗AΦin(12)
又因为根据公式(8),
L
o
c
=
Φ
o
u
t
/
(
π
∗
A
)
Lo_{c} = \Phi_{out}/{(\pi*A)}
Loc=Φout/(π∗A),那么
L
o
c
=
f
r
c
∗
Φ
i
n
A
=
Φ
o
u
t
π
∗
A
(13)
Lo_c = fr_c * \frac{\Phi_{in}}{A} = \frac{\Phi_{out}}{\pi*A} \tag{13}
Loc=frc∗AΦin=π∗AΦout(13)
又因为
c
d
i
f
f
=
Φ
o
u
t
/
Φ
i
n
c_{diff} = \Phi_{out}/\Phi_{in}
cdiff=Φout/Φin,那么可以得到:
f
r
c
=
Φ
o
u
t
π
∗
Φ
i
n
=
c
d
i
f
f
π
(14)
fr_c = \frac{\Phi_{out}}{\pi*\Phi_{in}} = \frac{c_{diff}}{\pi} \tag{14}
frc=π∗ΦinΦout=πcdiff(14)
即:
f
r
L
a
m
b
e
r
t
i
a
n
(
l
,
v
)
=
f
r
c
=
Φ
o
u
t
π
∗
Φ
i
n
=
c
d
i
f
f
π
(14)
fr_{Lambertian}(l,v) = fr_c = \frac{\Phi_{out}}{\pi*\Phi_{in}} = \frac{c_{diff}}{\pi} \tag{14}
frLambertian(l,v)=frc=π∗ΦinΦout=πcdiff(14)
至此,我们得到了 Lambertian 材质的 漫反射 BRDF 公式
f
r
l
a
m
b
e
r
t
i
a
n
(
l
,
v
)
=
c
d
i
f
f
π
fr_{lambertian}(l,v)=\frac{c_{diff}}{\pi}
frlambertian(l,v)=πcdiff.
三、参考引用
[1].Real-Time Rendering, 4th Edition-Chapter 9 Physically Based Shading
[2].Background: Physics and Math of Shading