Blinn-Phong Shading
现实生活中因为光的存在我们才能看到物体,没有光我们将会看到一片漆黑。那么在计算机的世界中如何模拟这么一种光呢?这个问题孕育出了着色器(shader)这一工具。
着色器是一种专门用于计算图像中颜色的程序,它运行在图形处理单元(GPU)上。通过编写着色器程序,可以实现对虚拟场景中的光源、物体材质以及它们之间的相互作用进行精确控制,从而产生逼真的视觉效果或特定的艺术效果。
今天介绍一种着色模型Blinn-Phong着色模型,Blinn-Phong着色模型是Phong模型的改进,所以在这之前先介绍一下Phong着色模型。
Phong Shading
在Phong Shading中,对于模型上的每一个像素(或者说片段),都会进行以下步骤的计算:
- 插值法向量:首先,在每个顶点上计算法向量,并使用Gouraud着色等方法对这些法向量进行插值,以得到多边形表面上每个像素处的法向量。
光照计算:然后,根据插值得到的每个像素处的法向量,结合光源的位置和强度、观察者的视角等因素,使用Phong反射模型来计算该点的颜色。Phong反射模型包括环境光、漫反射和镜面反射三个部分:
环境光:表示从环境中来的间接光,即使没有直接光源也能看到物体的基础亮度。
$$ I_{ambient} = k_aI_a,k_a是材质的环境光系数,I_a是环境光强度。 $$
漫反射:与光线入射角相关,反映了光线照射到粗糙表面时的均匀散射现象。
$$ \begin{array}{c} I_{diffuse} = k_dI_l(N\cdot L)\\k_d是材质的漫反射系数\\ 表示该着色点的光吸收率,范围是[0,1] ,如果该系数是 0,表明该着色点完全吸收能量\\反之,如果是 1,代表该店完全不吸收能量(即完全反射)。 \\I_l是光源强度\\N是表面法向量\\L是从表面点指向光源的单位向量。 \end{array} $$
镜面反射:模拟光滑表面的高光效果,高光的产生:在物体表面的观察角度与光源角度正好是镜面对称时,即可看到高光,其强度依赖于观察角度和光源的角度。
$$ \begin{array}{c} I_{specular} = k_sI_l(R\cdot V)^n\\k_d是材质的镜面反射系数。 \\I_l是光源强度 \\n是光泽度或镜面指数 \\R是理想反射方向,可以通过以下公式计算: R=2(N⋅L)N−L \\V是从表面点指向观察者的单位向量 \end{array} $$
- 颜色合成:最后,将上述三部分光的效果综合起来,形成最终的像素颜色。
$$ I = I_{ambient}+I_{diffuse}+I_{specular} $$
Blinn-Phong Shading
发现phong shading计算R时需要一次点乘,为了优化提出了Blinn-Phong Shading
Blinn-Phong光照模型提出使用另一种计算方法:半程向量
半程向量h = 观察方向v+光线方向l
通过比对法向量n和半程向量h的接近程度来判定高光:
$$ cos \alpha = n \cdot h $$
所以优化后的高光项
$$ I_{specular} = k_sI_lmax(0,cos\alpha)^n $$