Blinn-Phong Shading

现实生活中因为光的存在我们才能看到物体,没有光我们将会看到一片漆黑。那么在计算机的世界中如何模拟这么一种光呢?这个问题孕育出了着色器(shader)这一工具。

着色器是一种专门用于计算图像中颜色的程序,它运行在图形处理单元(GPU)上。通过编写着色器程序,可以实现对虚拟场景中的光源、物体材质以及它们之间的相互作用进行精确控制,从而产生逼真的视觉效果或特定的艺术效果。

该图片由计算机生成

今天介绍一种着色模型Blinn-Phong着色模型,Blinn-Phong着色模型是Phong模型的改进,所以在这之前先介绍一下Phong着色模型。

Phong Shading

在Phong Shading中,对于模型上的每一个像素(或者说片段),都会进行以下步骤的计算:

  1. 插值法向量:首先,在每个顶点上计算法向量,并使用Gouraud着色等方法对这些法向量进行插值,以得到多边形表面上每个像素处的法向量。
  2. 光照计算:然后,根据插值得到的每个像素处的法向量,结合光源的位置和强度、观察者的视角等因素,使用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} $$

  3. 颜色合成:最后,将上述三部分光的效果综合起来,形成最终的像素颜色。

$$ 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 $$

最后修改:2025 年 02 月 07 日
如果觉得我的文章对你有用,请随意赞赏