Blinn-Phong 光照模型


泛光模型

泛光模型只考虑环境光的影响:

\[I_{env} = K_aI_a\]

其中$K_a$是物体表面对环境光的反射率,$I_a$是入射环境光的亮度。

avatar

这个模型只能得到物体的平面结构,但体现体积感还需要添加下面的漫反射模型。


Lambert漫反射模型

漫反射指的是光从一定角度入射之后,从这个点向四面八方反射,且各方向反射的光的强度相等。

模拟漫反射首先考虑入射光的角度:

avatar

入射角度越倾斜损失的能量越大,应该将光强乘上$cosθ=l·n$,其中$l$是入射光方向,$n$为平面法线方向。

光源与照射点的距离也需要考虑,离得越近强度越大。得到以下公式:

avatar

$k_d$为漫反射系数,$I$为入射光强,取max是为了剔除夹角大于90°的光。

将泛光模型和漫反射模型结合,可以得到如下结果:

avatar

观察图片,加上高光才会更真实,所以需要用到反射模型。


Phong反射模型

avatar

在Phong反射模型中会考虑镜面反射角度$R$与观察角度$v$的夹角:

\[L_s=k_s(I/r^2)max(0,cosα)^p\]

其中$k_s$为镜面反射系数,添加指数p的原因是加速衰减。

avatar

将以上的模型累加得到结果:

avatar

对计算反射方向与人眼观察方向角度进行优化,就有了下面的Blinn-Phong反射模型。


Blinn-Phong反射模型

避免计算反射方向$\hat{v}$,为此引入新的矢量:半程向量$\hat{h}$,对$\hat{v}$和$\hat{l}$取平均后再归一化来得到:

avatar

这种方法的优点是加速了角度计算,提升计算的效率,具体来说,算出的近似角度是正确角度的一半。

总结上面的几种光照:

avatar



着色方法

在光照模型中涉及法线向量,法线可能对应三角形面,也可能对应顶点。这涉及到了着色频率的问题,可以分类为面着色、顶点着色、像素着色,即是三种不同的着色方法。

Flat Shading

以一个面作为着色单位,利用每个面的法线向量进行一次Blinn-Phong反射光照模型的计算,将颜色赋予整个面,效果如下:

avatar

计算很快,但是效果很差。


Gouraud Shading

Gouraud Shading对每个三角形的顶点进行着色,顶点法线计算方法是将所有共享该点的面法线向量相加求均值,再标准化。对于三角形内部的点,利用重心坐标(参考链接)来插值得到它的颜色

\[c=αc_0+βc_1+γc_2\]

$c_0$、$c_1$、$c_2$是三个顶点的颜色,$α$、$β$、$γ$是三角形内一点的重心坐标。

avatar

可见对顶点计算,效果有明显提升。


Phong Shading

Phong Shading对上面的方法进行了改进,通过插值法线来真正对每一个点都进行光照模型的计算:

\[n=αn_0+βn_1+γn_2\]

得到每个点的法线后,再进行Blinn-Phong模型计算,效果对比如下:

avatar

不同精度下的对比:

avatar