📜  计算机图形学中的 Phong 模型(镜面反射)

📅  最后修改于: 2022-05-13 01:57:13.037000             🧑  作者: Mango

计算机图形学中的 Phong 模型(镜面反射)

先决条件 -基本照明模型

Phong 反射模型:
当我们观察发光的发光表面时,例如闪闪发光的表面、抛光的金属片、苹果等,我们在某些观察点位置发现了一种亮点。这种现象称为镜面反射。

看下图:

N = Normal vector
L = Point light source
V = Viewing direction
R = is representing the unit vector directed towards the ideal specular reflection
∅ = Viewing angle relative to the specular reflection direction R.
θ = Angle made by L & R with N.

对于理想的反射面(完美的镜子),入射光仅在镜面反射方向上反射。因此,在这种情况下,当向量 V & R 重合(视角(∅=0))时,我们可以看到反射光。



亮面的镜面反射范围较窄,而暗面的反射范围较宽。由 Phong Bui Tuong 发明的用于计算镜面反射范围的经验模型也称为Phong 镜面反射模型。该模型设置镜面反射成正比的COS N s(∅)的强度。角度∅的范围可以在0≤∅≤1之间其中n s镜面反射参数,其值由要显示的表面类型决定。更亮(有光泽)表面的n s值可以是 100 或更多,而对于暗淡表面,其值是 1 或小于 1。镜面反射的强度取决于表面的物体(材料)属性和光的角度入射光,以及其他因素,例如入射光的偏振和颜色。

我们可以通过对每个表面使用光谱反射函数W(∅) 的镜面反射来控制光的强度变化。其中的值在0 ≤ ∅ ≤ 1的范围内一般来说, W(∅)会随着入射角的增加而增加,在 ∅=90* W(90*)=1 处,在这种情况下,所有入射到材料表面的光被反射。因此,使用光谱反射函数W(∅) 我们可以将Phong 镜面反射模型为:
\mathbf{I_{spec}=W(\theta)*I_l*cos^{n_s}(\theta)}\\ \textbf{Where, \,}\mathbf{\,I_l=}\textbf{Intensity of the light source  and}\\ \mathbf{ \phi=}\textbf{viewing angle relative to the specular-reflection vector direction(R).}

对于许多不透明的材料表面,镜面反射对于所有入射角几乎都是恒定的。因此,在这种情况下,我们可以用常数系数 (Ks)替换W(∅) ,并且对于每个表面,该值位于0 和 1之间:

  \mathbf{I_{spec}=k_s*I_l*cos^{n_s}(\theta)}

Since, V & R are unit vectors so, |V|=|R|=1 :
                          V * R = |V|*|R|*cos(θ)  , 
                          V * R = cos(θ)                                                                                 

所以,我们可以把前面的等式写成:



\mathbf{I_{spec}=k_s*I_l*(R*V)^{n_s}}

这里, R可以通过L在法向量方向上的投影计算得到:

R + L = (2*N.L)*N
So, using the above equation specular-reflection vector is obtained,
R = (2*N.L)*N - L.

Phong 模型中的组合环境反射、漫反射和镜面反射可以表示为具有多个光源的以下等式:

因此,对于单点光源,我们可以将照明表面上一点的组合反射和镜面反射建模为:

\mathbf{I=I_{diff}+I_{spec}}\\ \mathbf{I=k_aI_a+k_dI_L*(N*L)+k_sI_L(R*V)^{n_s}}\\ \textbf{Where}\mathbf{\,\,k_a ,\,I_a}\textbf{ \,are ambient reflectivity constant and ambient light intensity. }

并且,对于n 个点光源,方程将是:

\mathbf{I=k_aI_a+\Sigma_{i=1}^{n}[k_dI_L*(N*L)+k_sI_L(R*V)^{n_s}]}