经典的光照模型(不是基于物理的,是基于经验的,因为看起来像) ,分成三部分,高光,漫反射和环境光
反射向量
反射向量计算公式的推导,红色的向量就是我们想求的反射向量,做出入射向量的延长线,这时反射向量的值为v+2B,B等于法线向量与入射光在标准化法线向量上的投影的乘积,由于入射光线的方向相反所以要取负值dot(v,n)*n,所以
反
射
向
量
=
v
−
2
∗
d
o
t
(
v
,
n
)
∗
n
反射向量=v-2*dot(v,n)*n
反射向量=v−2∗dot(v,n)∗n
Lambetian模型
也叫漫反射模型
L
d
=
k
d
(
I
/
r
2
)
m
a
x
(
0
,
n
∗
l
)
L_d=k_d(I/r^2)max(0,n*l)
Ld=kd(I/r2)max(0,n∗l)
其中
k
d
k_d
kd是系数,不同的材料会有不同的系数,
I
I
I是光照强度,
r
2
r^2
r2是距离,
I
/
r
2
I/r^2
I/r2是光照的强度。根据光照的方向也会有个强度,当光照为负向的时候,漫反射为0.
除了漫反射还有环境光(ambient),使场景更加真实:
L
a
=
k
a
I
a
L_a=k_aI_a
La=kaIa
Phong模型
在 Lambetian的基础上,phong加入了高光(specular)高光通常用在类似金属这种材料上:
L
s
=
k
s
(
I
/
r
2
)
m
a
x
(
0
,
v
∗
R
)
p
L_s=k_s(I/r^2)max(0,v*R)^p
Ls=ks(I/r2)max(0,v∗R)p计算反射光和眼看向物体的角度的偏移。高光项最后的系数是为了让高光范围更小,突变更明显。
Blinn-Phong模型
phong模型中反射光的计算量较大,Blinn-Phong使用了所谓"半程向量“进行了优化::
h
=
b
i
s
e
c
t
o
r
(
v
,
l
)
=
v
+
l
∣
∣
v
+
l
∣
∣
h=bisector(v,l)=\frac{v+l}{||v+l||}
h=bisector(v,l)=∣∣v+l∣∣v+l使用法线和视角方向入射方向三个量进行计算就会比较简单,改成了:
L
s
=
k
s
(
I
/
r
2
)
m
a
x
(
0
,
n
∗
h
)
p
L_s=k_s(I/r^2)max(0,n*h)^p
Ls=ks(I/r2)max(0,n∗h)p
我们现在常用的光照模型是就是Blinn-Phong模型,使用公式:
L
=
L
a
+
L
d
+
L
s
=
k
a
I
a
+
k
d
(
I
/
r
2
)
m
a
x
(
0
,
n
∗
l
)
+
k
s
(
I
/
r
2
)
m
a
x
(
0
,
n
∗
h
)
p
L=L_a+L_d+L_s=k_aI_a+k_d(I/r^2)max(0,n*l)+k_s(I/r^2)max(0,n*h)^p
L=La+Ld+Ls=kaIa+kd(I/r2)max(0,n∗l)+ks(I/r2)max(0,n∗h)p