光照和颜色

在相同的光照下,不同的物体呈现出不同的颜色。或者把同一个物体,放在不同的光照下,也会呈现出不同的色彩。



这说明物体最终呈现出来的颜色,跟物体本身基底色,也跟光的颜色有关。但不同的光,照射时的情况不一样,导致最终反射进我们眼睛的光也不一样。 我们能看到物体,就因为有光反射进我们的眼睛。我们可以把光源类型分为: 方向光 / 平行光 / 太阳光(它从非常遥远的地方射过来,到达地球时接近平行)、 环境光点光源光、聚光灯光。

不论何种光照,都遵循以下的反射定律。

1. 反射定律

光射到一个界面时,反射角等于入射角。反射线、如射线和法线都在同一平面内,反射线和入射线分居法线两侧。

2. 镜面反射

表面光滑,当一束平行光射到这个反射面时,仍会平行的向一个方向反射出去。

3. 漫反射

表面粗糙,当一束平行光射到这个反射面时,反射面会把光向着四面八方反射,左图。把它画成一个理想模型时,在各个方向都均匀,如右图。 反射颜色公式中的入射光除了平行光,还可以是点光源的光。

当我们正对着一个平面看时,如果一束光是垂直照射到平面上的,那我们看到的效果就是光和平面的基底色分别在对应的 vec3 上的各 r、g、b 元素相乘。但如果光以跟法线成一个 θ 的角度入射时呢?那我们并不能接收所有反射光,我们只能接收到它在法线上的有效分量,即反射光颜色 × cosθ。 当 θ 越小,也即光约接近垂直方向照射时,反射光越强;而当 θ 越大,也即光约接近水平方向照射时,反射光越弱。在漫反射中, 因为反射光在各个方向都是均匀的,所以当我们不正看平面,而以不同的角度看时,这个公式依然正确。

漫反射颜色 = 入射光颜色 × 表面基底色 × cosθ

4. 环境反射

环境光被多次反射后,从各个角度照射到物体,方向均匀,强度相等,反射光也如此。可认为反射光逆着入射光反射。

环境反射颜色 = 入射光颜色 × 表面基底色

表面的反射光颜色 = 漫反射颜色 + 环境反射颜色

如何求cosθ

依据线性代数中的点乘(內积),可以求得cosθ。原理如下:dot_cross_vector

当向量 ab 分别是法线向量和反射光向量时,α - β = θ。而如果把它们都归一化后,那长度都是1, 即 |a|·|b| = 1。这是就可得 cosθ = a·b。即把两个向量归一化后再点乘,可以求得它们夹角的余弦值。在 GLSL ES 里有内置的 dot 函数。