点光源
假设点光源的光的强度(能流密度)是\(E=I\),由于点光源向外发送能量是以球面波的形式发送。在距离光源\(r\)处的波面上,光的强度是\(E=\frac{I}{r^2}\)。这一点与大学物理相同。
Blinn-Phong反射模型
首先给出以下定义:
对于某个物体上需要被着色的某一点。其单位法向量为\(\bm n\),这一点指向相机的单位向量为\(\bm v\),指向光源的向量为\(\bm l\)。
漫反射
漫反射意味着,从四面八方看过来,这个位置的颜色是一致的。
我们主要关注,这个位置与光源的角度关系,从而得出这个点的颜色。
Lambert’s cosine law
假设光源到达这个点的强度是\(E=I\),那么经过漫反射后,其强度变为\(E=Icos\theta\),即\(E=I\cdot\bm l\cdot\bm n\)
结合点光源,以及漫反射系数,可得
\[L_d=k_d(\frac{I}{r^2})max(0,\bm n\cdot\bm l) \]
其中,\(k_d\)是漫反射系数,与材质有关。\(I\)是点光源的强度,\(r\)是点光源到需要着色的点的距离。后面max的作用是,防止从“内部”或者“下面”射来的光线影响了“表面”的颜色。
通常,\(k_d\)是一个三维向量,如果将纹理颜色赋值给\(k_d\),则会起到给模型贴纹理的效果。
\(L_d\)和\(I\)也是三维向量,\(I\)不仅可以代表光的强度,也可以表示光的颜色。\(k_d\)与\(I\)的乘法是元素之间相乘。在Eigen中使用cwiseProduct函数。
镜面反射
即,某些材质中,反射角等于入射角,或者反射角很接近入射角时,出现的光强明显大于其他角度的情况。
此时\(\bm v\)非常接近反射角,或者有,半程向量非常接近于法向量\(\bm n\)。
半程向量即是\(\bm l,\bm v\)的角平分线的单位向量。有
\[\bm h = \frac{\bm v+\bm l}{||\bm v+\bm l||} \]
此时相机收到的光强为
\[L_s = k_s(\frac{I}{r^2})max(0,\bm n\cdot\bm h)^p \]
其中\(k_s\)是镜面反射系数,\(p\)决定了\(\bm v\)和反射角有多接近才算能触发镜面反射。\(p\)越大触发镜面反射的角度范围越小。通常会取到\(100\)以上。
\(k_s,L_s,I\)仍然是三维向量,乘法规则同前,只不过这里的\(k_s\)通常会采用比较亮的白色,而不会采用其他颜色。
环境光反射
即通过整个环境其他物体的反射,再次射入该物体,给该物体提供亮度。
在Blinn-Phong模型中,我们选择添加常数的亮度。
\[L_a = k_aI_a \]
\(k_a\)是环境光反射常数。
\(k_a,L_a,I_a\)仍然是三维向量,乘法规则同前,只不过这里的\(k_s\)通常会采用比较暗的白色,而不会采用其他颜色。
注意,有多个光源时,不要重复添加环境光反射。
三个反射混合
\[L = L_a+L_d+L_s \]