[OpenGL] Lambertian材质漫反射BRDF方程的解释与推导
一、简介
本文简单的介绍了 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