《WebGL 编程指南》笔记 —— 第八章 光照
- 当光线照射到物体上时,发生了两个重要现象:
(1)根据光源和光线方向,物体不同表面的明暗程度变得不一致。
(2)根据光源和光线方向,物体向地面投下了影子。
-
着色和阴影
着色
(shading):根据光照条件重建“物体各表面明暗不一的效果”的过程。
阴影
(shadowing):物体向地面投下影子的现象。 -
真实世界中的光的类型:
(1)平行光
(directional light),类似于自然中的太阳光。平行光线相互平行,具有方向,可以用一个方向和一个颜色来定义。
(2)点光源光
(point light),类似于人造灯泡的光。点光源光是从一个点向周围的所有方向发出的光,需要指定点光源的位置和颜色。光线的方向将根据点光源的位置和被照射之处的位置计算出来。
(3)环境光
(ambient light),模拟非直射光,也就是由光源发出后经过墙壁或其他物体反射后的光。环境光(间接光)是指那些经光源(点光源或平行光源)发出后,被墙壁等物体多次反射,然后照到物体表面上的光。环境光从各个角度照射物体,其强度都是一致的。环境光不用指定位置和方向,只需指定颜色即可。
(4)聚光灯光
(spot light),模拟电筒、车前灯等。
-
反射光的颜色,取决于:入射光(方向、颜色)和物体表面的类型。
-
物体表面反射光线的方式:
(1)漫反射(diffuse relection)
针对平行光或点光源,漫反射的反射光在各个方向上是均匀的。
漫反射光颜色
= 入射光颜色
× 表面基底色
× cosa
cosa
= 光线方向
· 法线方向
漫反射光颜色
= 入射光颜色
× 表面基底色
× (光线方向
· 法线方向
)
(2)环境反射(enviroment/ambient reflection)
针对环境光,环境反射的反射光的方向可以认为是入射光的反方向。在各个方向均匀。
环境反射光颜色
= 入射光颜色
× 表面基底色
注:表面基底色是物体本来的颜色,也就是物体在白光下的颜色
当漫反射和环境反射同时存在时,将两者加起来,就会得到物体最终被观察到的颜色
表面的反射光颜色
= 漫反射光颜色
+ 环境反射光颜色
-
归一化
(normalization):将一个矢量的长度调整为1,同时保持方向不变的过程。 -
平面的法向量唯一,即平面上的任意一点都具有相同的法向量。
-
逆转置矩阵(inverse transpose matrx)
变换后的法向量
=法向量
×模型矩阵的逆转置矩阵
求逆转置矩阵的两个步骤:
(1)求原矩阵的逆矩阵 Matrix4.setInverseOf(m)
(2)将上一部求得的逆矩阵进行转置 Matrix4.transpose()