文章目录
- 渲染管线中光照的计算
- 前言
- 法向量
- 朗伯余弦定律
- 漫反射
- 环境光照
- 镜面光照
- 菲涅尔效应
- 表面粗糙度
- 光照模型
- 平行光源
- 点光源
- 衰减
- 聚光灯
渲染管线中光照的计算
前言
首先我们来看一下同一个模型在有光与无光下的区别:
无光:
有光
很明显的感知就是无光下渲染的模型,给人的感受是扁平化,不像一个模型,但是在经过光照渲染之后,就可以感受出立体效果。光照下的模型经过光照(lighting)与阴影(shading)的叠加,给我们展现出了很好的立体效果。而我们所看到的颜色,是依靠模型的材质呈现的。
看下图,在同一个平行光源(后面会讲解)下,同一个物体,不同材质下所呈现的结果不同,材质呢,有粗糙度,如石头,与瓷砖,当然还有金属度、折射率、透明度等。A球就是带透明的,因此,他在光照的影响下产生了折射,所以我们能看见它背后的物体,而B球则不能。人眼看见光的原因是因为光照射到物体上时候,一部分会被吸收,一部分会被反射,反射的光进入人眼,光受体感受到刺激,将信号传入大脑,也就是我们所能看到颜色的原因。
法向量
法向量是指垂直于给定曲面、曲线或几何体的向量(对于曲面就是垂直于切线空间)。下图就是相对于A点的法向量
朗伯余弦定律
光可以看作是光子的集合,在空间中按特定的方向传播。每个光子都载有(光)能量。光源每
秒发出的(光)能量称为辐射通量(radiant flux)。而单位面积上的辐射通量密度(irradiance,称为辐(射)
照度)。我们将辐射通量用来确定表面某区域所接收到的光量(即眼晴感受到的明亮度)。
一个面元的辐亮度或光亮度在其表面上半球的所有方向相等时,则有
E
θ
=
E
n
c
o
s
θ
=
E
n
(
n
⋅
L
)
E_θ=E_ncosθ = E_n(n·L)
Eθ=Encosθ=En(n⋅L)
式中,
E
θ
E_θ
Eθ和
E
n
E_n
En分别表示面元在 θ 角(与表面法线夹角)方向及其法线方向的辐射强度或光强度,
n
n
n是法向量,
L
L
L光向量
(可以理解越接近于垂直照射的光,能量越强)
考虑到
(
n
⋅
L
)
=
c
o
s
θ
(n·L) =cosθ
(n⋅L)=cosθ 这值是有可能小于0的,因此,给它限定了一下范围
f
(
θ
)
=
m
a
x
(
c
o
s
θ
,
0
)
=
m
a
x
(
n
⋅
L
,
0
)
(
也就是要求它大于等于
0
)
f(θ) = max(cosθ,0)=max(n·L,0) (也就是要求它大于等于0)
f(θ)=max(cosθ,0)=max(n⋅L,0)(也就是要求它大于等于0)
这部分建议大家参考百度文库的资料
漫反射
当光照射到物体表面上某个点时候,一部分会被吸收,一部分会被四处反弹。(因为看似是平面的物体,其实放大之后,是凹凸不平的)
假设一点的有80%白光的入射光量,而这点的漫反射率是50%的红光,100%的绿光,75%的蓝光,则入射光量值
B
L
=
(
0.8
,
0.8
,
0.8
)
B_L=(0.8,0.8,0.8)
BL=(0.8,0.8,0.8),漫反射率为
m
d
=
(
0.5
,
1.0
,
0.75
)
m_d=(0.5,1.0,0.75)
md=(0.5,1.0,0.75)则这个点的反射光量是:
c
d
=
B
L
⊙
m
d
=
(
0.8
,
0.8
,
0.8
)
⊙
(
0.5
,
1.0
,
0.75
)
=
(
0.4
,
0.8
,
0.6
)
(
⊙
对应元素相乘
)
c_d =B_L⊙\\ m_d = (0.8,0.8,0.8)⊙(0.5,1.0,0.75)\\ = (0.4,0.8,0.6)\\ \quad\\ (⊙对应元素相乘)
cd=BL⊙md=(0.8,0.8,0.8)⊙(0.5,1.0,0.75)=(0.4,0.8,0.6)(⊙对应元素相乘)
根据朗伯余弦定律就有了:
c
d
=
m
a
x
(
L
⋅
n
,
0
)
⋅
(
B
L
⊙
m
d
)
c_d =max(L·n,0) ·(B_L⊙m_d)
cd=max(L⋅n,0)⋅(BL⊙md)
环境光照
我们不仅要考虑光源的影响,还需要考虑间接光照的影响,比如,太阳光照射到水面,然后水面反射到镜子里,镜子再反射到某个物体上,其实真实世界中,间接光照是很多的,就比如。下方是环境光照的方程:
c
a
=
A
L
⊙
m
d
c_a =A_L⊙m_d
ca=AL⊙md
A
L
A_L
AL指定了表面接收到的间接光量(环境光量),
m
a
m_a
ma依旧是漫反射率。对于环境光照的计算,是在当前的光照模型中,都按照统一的环境光照计算,并没有进行真实的物理世界的模拟,光照计算,是耗性能的过程。
镜面光照
镜面反射是指光线在平滑表面上的反射,使得反射光线与入射光线在同一平面内,并且入射角等于反射角。
镜面反射通常发生在光线从一个介质进入另一个折射率较小(折射率指介质对光的折射程度)的介质时,比如从空气进入玻璃或水中时。
菲涅尔效应
菲涅尔效应描述了光线从一个介质进入另一个介质时,由于折射率的不同而产生的反射现象。
菲涅尔效应的主要表现是入射光线部分反射和部分折射,即一部分光线通过介质界面进入另一个介质,另一部分光线则反射回原介质。
下图一个由近到远的过程,可以看到近处的石头清晰,远处的石头看不清,因为在远处的石头,几乎不发生折射。
菲涅尔效应的强度取决于入射角、介质的折射率差异以及极化状态等因素。
由于光照过程的复杂性,我们一般不会将完整的菲涅耳方程用于实时渲染,而是采用石里克近似
Schlick approximation)法来代替:
R
F
(
θ
i
)
=
R
F
(
0
○
)
+
(
1
−
R
F
(
0
○
)
)
(
1
−
c
o
s
θ
i
)
5
R_F(θ_i) = R_F(0^○) +(1-R_F(0^○))(1-cosθ_i)^5
RF(θi)=RF(0○)+(1−RF(0○))(1−cosθi)5
R
F
R_F
RF是反射光量,
1
−
R
F
(
0
○
)
1-R_F(0^○)
1−RF(0○)是折射光量,
R
F
R_F
RF的值是一个RGB的向量,即颜色反应了反射光量。
下面是场景的一些材质对应的属性值:
介质 | R F ( 0 ○ ) R_F(0^○) RF(0○) |
---|---|
水 | (0.02,0.02,0.02) |
玻璃 | (0.08,0.08,0.08) |
塑料 | (0.05,0.05,0.05) |
金 | (1.0,0.71,0.29) |
银 | (0.95,0.93,0.88) |
铜 | (0.95,0.64,0.54) |
表面粗糙度
真实世界的反射物体表面不是理想镜面,而是在微观下具有一定的粗糙度。理想转态下的镜面粗糙度是0,它的宏观与微观的法向方向是相同的,但是真实世界下不是。
我们定义归一化分布函数
ρ
(
θ
h
)
∈
[
0
,
1
]
\rho(θ_h)∈[0,1]
ρ(θh)∈[0,1],用来表示微观表面法线h与宏观表面法线n之间夹角为
θ
h
θ_h
θh
函数公式:
ρ
(
θ
h
)
=
c
o
s
m
(
θ
h
)
=
c
o
s
m
(
n
⋅
h
)
\rho(θ_h)=cos^m(θ_h)=cos^m(n·h)
ρ(θh)=cosm(θh)=cosm(n⋅h)
我们将
ρ
(
θ
h
)
\rho(θ_h)
ρ(θh)与某种归一化因子进行融合,从而获得基于粗糙度来模拟镜面反射光量的新函数:
S
(
θ
h
)
=
m
+
8
8
c
o
s
m
(
θ
h
)
=
m
+
8
8
(
n
⋅
h
)
m
S(θ_h) = \frac{ m+8}{8}cos^m(θ_h) \\ = \frac{ m+8}{8}(n·h)^m
S(θh)=8m+8cosm(θh)=8m+8(n⋅h)m
经过菲涅尔效应计算,镜面反射进入观察者眼的光量为:
C
s
=
m
a
x
(
L
⋅
n
,
0
)
⋅
B
L
⊙
R
F
(
a
h
)
m
+
8
8
(
n
⋅
h
)
m
C_s=max(L·n,0)·B_L⊙R_F(a_h)\frac{ m+8}{8}(n·h)^m
Cs=max(L⋅n,0)⋅BL⊙RF(ah)8m+8(n⋅h)m
可以发现,如果
L
⋅
n
⩽
0
L·n\leqslant0
L⋅n⩽0那么所计算的结果是射向表面另一侧的光,因此此时正表面不会接收到任何光照。
光照模型
光照模型,是根据光学的有关定律,模拟自然界中光照明的物理过程的计算机模型。
我们所看到的光照,就是各种光的叠加,比如环境光,漫反射光、镜面反射光的叠加,在数学公式上,就这些公式的加法运算。
C
o
l
o
r
=
c
a
+
c
d
+
c
s
=
A
L
⊙
m
d
+
m
a
x
(
L
⋅
n
,
0
)
⋅
(
B
L
⊙
m
d
)
+
m
a
x
(
L
⋅
n
,
0
)
⋅
B
L
⊙
R
F
m
+
8
8
(
n
⋅
h
)
m
=
A
L
⊙
m
d
+
m
a
x
(
L
⋅
n
,
0
)
⋅
B
L
⊙
(
m
d
+
R
F
(
a
h
)
m
+
8
8
(
n
⋅
h
)
m
Color = c_a+c_d + c_s\\ = A_L⊙m_d +max(L·n,0) ·(B_L⊙m_d) + max(L·n,0)·B_L⊙R_F\frac{ m+8}{8}(n·h)^m \\ = A_L⊙m_d +max(L·n,0) ·B_L⊙(m_d +R_F(a_h)\frac{ m+8}{8}(n·h)^m
Color=ca+cd+cs=AL⊙md+max(L⋅n,0)⋅(BL⊙md)+max(L⋅n,0)⋅BL⊙RF8m+8(n⋅h)m=AL⊙md+max(L⋅n,0)⋅BL⊙(md+RF(ah)8m+8(n⋅h)m
L
L
L:指同光源的光同量。
n
n
n:表面法线。
h
h
h:列于光向量与观察向量(由表面点指向观察点的单位向量)之间的中间向量。
A
L
A_L
AL:表示入射的环境光量。
B
L
B_L
BL:表示入射的直射光量。
m
d
m_d
md:指示根据表面漫反射率而反射的入射光量。
L
⋅
n
L·n
L⋅n:朗伯余弦定律。
a
h
a_h
ah:中间向量
h
h
h与光向量
L
L
L之间的夹角。
R
F
(
a
h
)
R_F(a_h)
RF(ah):根据菲涅耳效应,关于中间向量
h
h
h所反射到观察者眼中的光量。
m:控制表面的粗糙度。
(
n
⋅
h
)
m
(n·h)^m
(n⋅h)m:指定法线h与宏观表面法线n之间夹角为B,的所有微平面片段。
\frac{ m+8}{8}:在镜面反射过程中,为模拟能量守恒所采用的归一化因子。
平行光源
平行光源(parallel light)也称方向光源(directional light,也译作定向光源),是一种距离目标物体
极远的光源(每个入射角与照射位置行成的夹角值近似)。因此,我们就可以将这种光源发出的所有入射光看作是彼此平行的光线。(如下图)
点光源
类似于一个灯泡,向四面八方照射。对于任意一点
P
P
P,光源
Q
Q
Q所发出的光源总有一束会经过词典,我们定义光向量与传播方向相反,即光向量的方向是由
P
P
P指向
Q
Q
Q
L
=
Q
−
P
∣
∣
Q
−
P
∣
∣
L=\frac{Q-P}{||Q-P||}
L=∣∣Q−P∣∣Q−P
衰减
光强会随着距离的反比例平方而发生衰减,计算公式如下:
I
(
d
)
=
I
0
d
2
I(d)= \frac{I_0}{d^{2}}
I(d)=d2I0
I
0
I_0
I0为距离光源d=1处的光强
聚光灯
聚光灯在大于max angle的时候,点就不在灯的照射范围内了
与点光源计算一致,它的光向量:
L
=
Q
−
P
∣
∣
Q
−
P
∣
∣
L=\frac{Q-P}{||Q-P||}
L=∣∣Q−P∣∣Q−P
聚光灯范围内的所有光线强度也不尽相同,位于Light到Center上的是最强的,也就是最中心的线,其他向量会随着距离中心线的角度变大而变小,而随着角度增加至max angle,光强将逐渐趋近于0。
具体计算与之前类似,
k
s
p
o
t
k_{spot}
kspot表示聚光灯因子
k
s
p
o
t
(
θ
)
=
m
a
x
(
c
o
s
θ
,
0
)
x
=
m
a
x
(
−
L
⋅
d
,
0
)
k_{spot}(\theta)=max(cos\theta,0)^x =max(-L·d,0)
kspot(θ)=max(cosθ,0)x=max(−L⋅d,0)