基于物理的渲染,通俗一点说就是根据现实环境上光是如何照到物体,然后物体如何把光的颜色反射到人的眼睛的过程,通过渲染表达出来。而游戏中基于物理的渲染就是通过数学公式建模的方式来模拟(只是模拟并非完全准确)这个过程,从而达到更接近现实世界的渲染效果,显得画面更逼真。
从上面这句话的描述得知,整个物理渲染其实就用一句话最简单的话总结就是:、
求光从某个方向照射到物体后反射出来到肉眼的光。
用更具学术性的话语说就是:
求物体的双向反射分布函数,即BRDF。
因此,要在渲染上实现上面这句话,就要求我们去解开这些问题:
1、光是什么,如何用数学来量化光照。
2、物体会对光进行怎么样的反射,如何用数学来对此进行建模。
3、求出光经过物体反射后得到的光值是多少。
基于物理渲染的数学理论(推荐)
光是什么
光是一种电磁横波,以上下震荡的方式直线传播,电磁波的覆盖范围很广,但只有很小的一部分范围内(大约400到700纳米)对人类是可见的,因此着色只需要关注这部分。眼睛对光电磁波的不同频率感应为不同的颜色。
如何量化光
要对光进行数学量化,而光传播的本质是以电磁波辐射能量进行传播的,而辐射学(Radiometry)是用来度量电磁波辐射的学科,因此可以用辐射学来量化光的传播。
辐射学的常见基本量:
量化值 | 符号 | 单位 | 定义 |
---|---|---|---|
辐射能量 (Radiant Energy) | Q Q Q | J J J | 表面上入射的能量 |
辐射通量 (Radiant Flux) | Φ \Phi Φ | W W W或 J / s J/s J/s | 表面上入射能量的功率 |
辐照度(Irradiance) | E E E | W / m 2 W/{\bf m}^2 W/m2 | 单位面积上的能量入射功率 |
辐射度(Radiosity) | J J J | W / m 2 W/{\bf m}^2 W/m2 | 单位面积上的能量出射功率 |
辐射强度(Intensity) | I I I | W / s r 2 W/{\bf sr}^2 W/sr2 | 单位立体角的辐射通量 |
辐射率(Radiance) | L L L | W / ( m 2 s r ) 2 W/({\bf m}^2{\bf sr})^2 W/(m2sr)2 | 每单位面积每单位立体角的辐射通量 |
什么是立体角:
立体角其实就是2D圆的弧度角扩展到3D空间的表示,如上图中
r
2
{\bf r}^2
r2即为半径为
r
{\bf r}
r的球的立体角,这里辐射学用的通常是单位球。用
ω
{\bf \omega}
ω表示立体角,单位为
s
r
sr
sr(stereo radian)。(也有不规则的立体角,辐射学这里关注的是在单位球上形成圆边的曲面立体角)。
各个辐射学术名的关系与特点:
1、能量
能量用焦耳(
J
J
J)衡量,光源散射光子,每个光子具有特定的波长,对应的波长携带特定的能量。所有的基本辐射量实际上都是用不同的方法对光子进行测量。一个光子在波长为
λ
\lambda
λ时携带的能量:
Q
=
h
c
λ
Q=\frac{hc}{\lambda}
Q=λhc
c
c
c:光速,即
299
,
472
,
458
m
/
s
299,472,458{\bf m/s}
299,472,458m/s。
h
h
h:普朗克常量,
h
≈
6.626
×
1
0
−
34
m
2
k
g
/
s
h\approx6.626\times10^{-34}{\bf m}^2{\bf kg}/{\bf s}
h≈6.626×10−34m2kg/s。
2、辐射通量:
Φ
=
Q
t
{\Phi}=\frac{Q}{t}
Φ=tQ
d
d
d:微分表示符。
t
t
t:时间。
3、辐照度:
对于点光源,
E
E
E有公式:
E
=
Φ
4
π
r
2
E=\frac{\Phi}{4\pi r^2}
E=4πr2Φ
图解:辐射通量用于测量空间上通过的能量,对于点光源,能量会随着距离的增加而递减,但总的能量保持不变。
对于平行光,
E
E
E有公式:
E
=
Φ
A
E=\frac{\Phi}{A}
E=AΦ
A
A
A:面积。
定义垂直入射光方向的辐照度:
E
⊥
=
Φ
A
⊥
E{_\bot}=\frac{\Phi}{A{_\bot}}
E⊥=A⊥Φ
说明:从公式可以看出
E
E
E的值与面积
A
A
A有关,
当光线是以斜射角度入射时,光辐射同样的通量会分布到更多的面积上,根据上图有
A
A
A与
A
⊥
A{_\bot}
A⊥的关系:
A
⊥
=
A
c
o
s
θ
A{_\bot}=Acos\theta
A⊥=Acosθ
那么
E
⊥
=
Φ
A
c
o
s
θ
E{_\bot}=\frac{\Phi}{Acos\theta}
E⊥=AcosθΦ
即:
E
⊥
=
E
c
o
s
θ
E{_\bot}=Ecos \theta
E⊥=Ecosθ
4、辐射强度:
I
=
d
Φ
d
ω
I= \frac{{\bf d}\Phi}{{\bf d}\omega}
I=dωdΦ
辐射强度可以用于测量一个无限小点的辐射强度,这是指指通过单位立体角的辐射通量,所以辐射强度与距离无关。
5、辐射率:
L
=
d
E
⊥
d
ω
=
d
Φ
d
ω
d
A
⊥
=
d
Φ
d
ω
d
A
c
o
s
θ
L=\frac{{\bf d}E{_\bot}}{\bf d\omega}=\frac{{\bf d}\Phi}{{\bf d}\omega {\bf d}A{_\bot}}=\frac{{\bf d}\Phi}{{\bf d}\omega {\bf d}Acos\theta}
L=dωdE⊥=dωdA⊥dΦ=dωdAcosθdΦ
设想
ω
\omega
ω垂直于表面时,
d
A
{\bf d}A
dA是
d
A
⊥
{\bf d}A{_\bot}
dA⊥在上方的投影,如下图。
在基于物理着色中,辐射率是最核心的量化值,上述介绍其它量化值的目的也只是为了求出辐射率。辐射率可以看成是光照射到物体后反射到眼睛的颜色值,辐射率是眼睛上最直接感受到的量化值。辐射率在传播过程中与距离无关,都能够保持数值一致,感官眼睛上最直接的感受就是在真空中,不管我们离一个物体多远,如果还在视野内,那么看到它的颜色总是保持不变的,这个颜色其实就是量化值辐射率。
BRDF
双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)
BRDF可以解释为,给定从某个方向入射的光线,BRDF给出了该光线在表面上所有反射光和散射光的分布。
眼睛观察到的物体表面的颜色,受入射光和出射光(视角)方向影响,如下图,
v
{\bf v}
v表示出射光的单位向量,
l
{\bf l}
l表示入射光的单位向量,BRDF函数表示为
f
(
l
,
v
)
f({\bf l},{\bf v})
f(l,v)。
物体表面对光的量化函数称为BFRDF函数,在现实世界中,这个量化过程通常都是在单位半球上进行的,这样符合表面上某一点向外辐射能量的现象。那么在上述的
l
{\bf l}
l和
v
{\bf v}
v向量在确定某一点
p
{\bf p}
p上方的单位半球上则用立体角表示,
l
{\bf l}
l和
v
{\bf v}
v分别对应
ω
i
\omega{_i}
ωi和
ω
o
{\omega{_o}}
ωo,则有
f
(
l
,
v
)
=
f
(
p
,
ω
i
,
ω
o
)
f({\bf l},{\bf v})=f({\bf p}, \omega{_i},\omega{_o})
f(l,v)=f(p,ωi,ωo)。
而
l
{\bf l}
l在图中这个半平面上,可以用
ϕ
i
\phi{_i}
ϕi(方位角)和
θ
i
\theta{_i}
θi(天顶角)确定,
v
{\bf v}
v同理,所以有:
f
(
l
,
v
)
=
f
(
p
,
ω
i
,
ω
o
)
=
f
(
p
,
ϕ
i
,
θ
i
,
ϕ
o
,
θ
o
)
f({\bf l},{\bf v})=f({\bf p}, \omega{_i},\omega{_o})=f({\bf p},\phi{_i},\theta{_i},\phi{_o},\theta{_o})
f(l,v)=f(p,ωi,ωo)=f(p,ϕi,θi,ϕo,θo)。
注意:这是一个半平面上的示意图
在辐射学上量化BRDF定义为出射光方向
ω
o
\omega{_o}
ωo出射的辐射率
L
o
L{_o}
Lo与入射光方向
ω
i
\omega{_i}
ωi入射的辐照率
E
i
E{_i}
Ei的比值,因此有表达式:
f
(
p
,
ω
o
,
ω
i
)
=
d
L
o
(
p
,
ω
o
)
d
E
i
(
p
,
ω
i
)
=
d
L
o
(
p
,
ω
o
)
d
E
i
⊥
(
p
,
ω
i
)
c
o
s
θ
i
=
d
L
o
(
p
,
ω
o
)
L
i
(
p
,
ω
i
)
c
o
s
θ
i
d
ω
i
f({\bf p}, \omega{_o}, \omega{_i}) =\frac{{\bf d}L{_o}({\bf p}, \omega{_o})}{{{\bf d}E{_i}({\bf p}, \omega{_i})}}=\frac{{\bf d}L{_o}({\bf p}, \omega{_o})}{{{\bf d}E{_{i\bot}}({\bf p}, \omega{_i})}cos\theta{_i}}=\frac{{\bf d}L{_o}({\bf p}, \omega{_o})}{L{_i}({\bf p}, \omega{_i})cos\theta{_i}{\bf d}\omega{_i}}
f(p,ωo,ωi)=dEi(p,ωi)dLo(p,ωo)=dEi⊥(p,ωi)cosθidLo(p,ωo)=Li(p,ωi)cosθidωidLo(p,ωo)
所以根据BRDF求得出微分辐射率:
d
L
o
(
p
,
ω
o
)
=
f
(
p
,
ω
o
,
ω
i
)
⊗
L
i
(
p
,
ω
i
)
∣
c
o
s
θ
i
∣
d
ω
i
{\bf d}L{_o}({\bf p}, \omega{_o})= f({\bf p},\omega{_o}, \omega{_i})⊗L{_i}({\bf p}, \omega{_i})|cos\theta{_i}|{\bf d}\omega {_i}
dLo(p,ωo)=f(p,ωo,ωi)⊗Li(p,ωi)∣cosθi∣dωi
用⊗是因为
f
f
f和
L
i
L{_i}
Li都有RBG三个分量需要分别相乘。
则物体某一点
p
{\bf p}
p的辐射率为:
L
o
(
p
,
ω
o
)
=
∫
Ω
f
(
p
,
ω
o
,
ω
i
)
⊗
L
i
(
p
,
ω
i
)
∣
c
o
s
θ
i
∣
d
ω
i
L{_o}({\bf p}, \omega{_o})=\int_\Omega f({\bf p},\omega{_o}, \omega{_i})⊗L{_i}({\bf p}, \omega{_i})|cos\theta{_i}|{\bf d}\omega {_i}
Lo(p,ωo)=∫Ωf(p,ωo,ωi)⊗Li(p,ωi)∣cosθi∣dωi
Ω
\Omega
Ω:单位半球。
也称为反射方程式,用于计算物体表面的辐射率。
至此,上面给出了如何用BRDF
f
(
l
,
v
)
f({\bf l}, {\bf v})
f(l,v)函数求出点
p
{\bf p}
p上辐射率
L
o
(
p
,
ω
o
)
L{_o}({\bf p}, \omega{_o})
Lo(p,ωo)。但
f
(
l
,
v
)
f({\bf l}, {\bf v})
f(l,v)的解还未定义,因此需要对
f
(
l
,
v
)
f({\bf l}, {\bf v})
f(l,v)进行数学建模,即设定它的方程。
因为
f
(
l
,
v
)
=
f
(
p
,
ω
o
,
ω
i
)
=
f
(
p
,
ϕ
i
,
θ
i
,
ϕ
o
,
θ
o
)
f({\bf l}, {\bf v})= f({\bf p}, \omega{_o}, \omega{_i})=f({\bf p},\phi{_i},\theta{_i},\phi{_o},\theta{_o})
f(l,v)=f(p,ωo,ωi)=f(p,ϕi,θi,ϕo,θo),因此点
p
{\bf p}
p上的BRDF函数接收4个参数,经过数学模型方程式运算输出结果。
微表面理论
用BRDF函数且相同的4个参数值,对不同的物质进行测量(比如不锈钢杯与塑料杯),得出的结果值是不一致的,最直观的结果是在眼睛看来,金属和塑料的质感很不一样。
造成相同的参数值,不同物质BRDF函数得出不同的结果值原因有三个:
1、微表面的法线分布。
2、微表面几何衰减。
3、菲涅尔反射。
也就是说平常我们看起来不同物质的质感不一样,主要是由不同物质以上三个因素不同造成的,因此,我们要对不同物质的以上三个因素进行数学建模。
Torrance-Sparrow基于微表面理论,用三个函数建立了高光BRDF模型:
f
(
l
,
v
)
=
F
(
l
,
h
)
G
(
l
,
v
,
h
)
D
(
h
)
4
(
n
⋅
l
)
(
n
⋅
v
)
f({\bf l},{\bf v})=\frac{F({\bf l},{\bf h})G({\bf l},{\bf v},{\bf h})D({\bf h})}{4({\bf n}\cdot{\bf l})({\bf n}\cdot{\bf v})}
f(l,v)=4(n⋅l)(n⋅v)F(l,h)G(l,v,h)D(h)
F
F
F:菲涅尔函数。
G
G
G:微表面几何函数。
D
D
D:微表面法线分布函数。
n
{\bf n}
n:宏观表面法线。
h
{\bf h}
h:微观表面法线。
放到单位半球上的表示为(可省去点
p
{\bf p}
p的表示):
f
(
ω
i
,
ω
o
)
=
F
(
ω
o
,
ω
h
)
D
(
ω
h
)
G
(
ω
i
,
ω
o
)
4
c
o
s
θ
o
c
o
s
θ
i
f(\omega{_i},{\omega{_o}})=\frac{F(\omega{_o},\omega{_h})D(\omega{_h})G(\omega{_i},\omega{_o})}{4cos\theta{_o}cos\theta{_i}}
f(ωi,ωo)=4cosθocosθiF(ωo,ωh)D(ωh)G(ωi,ωo)