标准光照模型
标准光照模型只关心直接光照(直接从光源照射到物体表面后。经物体表面一次反射直接进入摄像机的光线)
我们可以将进入到摄像机的光线分为4个部分,分别是
- 自发光 c e m i s s i v e c_{emissive} cemissive
- 高光反射 c s p e c u l a r c_{specular} cspecular
- 漫反射 c d i f f u s e c_{diffuse} cdiffuse
- 环境光 c a m b i e n t c_{ambient} cambient
环境光
在标准光照模型中,我们可以通过一个全局变量来近似模拟环境光,场景中所有物体都使用此环境光即可。
自发光
全局光照中,自发光会照亮范围内的其他物体。
漫反射
在漫反射中可以认为光在任何方向上的反射都是相同的,所以漫反射与视角无关,只与入射光线的角度有关(这一点是不同于高光反射的)
漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
如上图,我们可以将漫反射强度看作正方形表面接收到的光照强度,左图正方形接受到了全部的6根光线,右图正方形因为旋转了60°的缘故只接受到了3根,由此可以看出反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。漫反射部分的计算公式如下: c d i f f u s e = ( c l i g h t ⋅ m d i f f u s e ) m a x ( 0 , n ^ ⋅ l ^ ) c_{diffuse}=(c_{light}\cdot m_{diffuse})max(0,\hat{n}\cdot \hat{l}) cdiffuse=(clight⋅mdiffuse)max(0,n^⋅l^)其中, c l i g h t c_{light} clight是光源颜色和强度, m d i f f u s e m_{diffuse} mdiffuse 是材质的漫反射颜色, n ^ \hat{n} n^ 是表面法线, l ^ \hat{l} l^ 是指向光源的单位矢量,因为夹角超过90°的部分不会受到光照,但向量点积为负值,所以计算时需要截取到0。
高光反射
这里的高光反射并不完全符合真实世界中的高光反射现象。
高光反射可以看作镜面反射,当视角方向与反射方向接近时才会看到高光。
计算高光反射我们需要知道表面法线
n
^
\hat{n}
n^ ,视角方向
v
^
\hat{v}
v^ ,光源方向
l
^
\hat{l}
l^ ,反射方向
r
^
\hat{r}
r^
其中反射方向可以通过表面法线与光源方向计算得出,这里给出公式:
r
^
=
2
(
n
^
⋅
l
^
)
n
^
−
l
^
\hat{r}=2(\hat{n} \cdot \hat{l})\hat{n} -\hat{l}
r^=2(n^⋅l^)n^−l^
Phong模型
在Phong模型中,我们使用计算所得到的
r
^
\hat{r}
r^和视角
v
^
\hat{v}
v^ 可以得到高光反射部分公式:
c
s
p
e
c
u
l
a
r
=
(
c
l
i
g
h
t
⋅
m
s
p
e
c
u
l
a
r
)
m
a
x
(
0
,
v
^
⋅
r
^
)
m
g
r
o
s
s
c_{specular}=(c_{light}\cdot m_{specular})max(0,\hat{v} \cdot \hat{r})^{m_{gross}}
cspecular=(clight⋅mspecular)max(0,v^⋅r^)mgross
其中
m
g
r
o
s
s
m_{gross}
mgross 是材质的光泽度,简单来看就是控制高光区域的亮点大小,量化来说就是通过一个指数来控制
v
^
⋅
r
^
\hat{v} \cdot \hat{r}
v^⋅r^ 余弦值的衰减速度。
m
g
r
o
s
s
m_{gross}
mgross 的值越大越陡,使得高光衰减越快,画面上导致高光区域变小,也就是亮点变小。
Blinn模型
可以看出,我们在Phong模型中计算
r
^
\hat{r}
r^ 还是蛮复杂的,在Blinn模型中就提出了一个简单的修改方法得到类似的效果。
Blinn模型引入了半程向量
h
^
\hat{h}
h^ ,也就是对
l
^
\hat{l}
l^和
v
^
\hat{v}
v^ 取均值后归一化得到的向量。
在这里
h
^
=
v
^
+
l
^
∣
v
^
+
l
^
∣
\hat{h}=\frac{\hat{v}+\hat{l}}{\vert\hat{v}+\hat{l}\vert}
h^=∣v^+l^∣v^+l^
之后我们再通过
n
^
\hat{n}
n^和
h
^
\hat{h}
h^之间的夹角进行计算,可以得到Blinn模型的公式:
c
s
p
e
c
u
l
a
r
=
(
c
l
i
g
h
t
⋅
m
s
p
e
c
u
l
a
r
)
m
a
x
(
0
,
n
^
⋅
h
^
)
m
g
r
o
s
s
c_{specular}=(c_{light}\cdot m_{specular})max(0,\hat{n} \cdot \hat{h})^{m_{gross}}
cspecular=(clight⋅mspecular)max(0,n^⋅h^)mgross
到此我们的光照部分就结束了,通常我们将上述标准光照模型成为Bilnn-Phong光照模型。但这种基于经验的光照模型还存在很多局限性,之后将学习到基于物理的光照模型。