光照模型

Lambert

粗糙的物体表面向各个方向等强度的反射光,这种等同地向各个方向散射的现象称为光的漫反射(diffuse reflection)。漫反射符合兰伯特定律(Lambert's law):反射光线的强度与表面法线和光源方向之间的夹角成正比。这是一种理想的漫反射模型,也被称为兰伯特光照模型。

  • 漫反射:

cdiffuse=(clightmdiffuse)max(0,nl)c_{diffuse} = (c_{light} \cdot m_{diffuse})max(0,\vec{n} \cdot \vec{l})

clightc_{light}:入射光线的颜色和强度。mdiffusem_{diffuse}:材质的漫反射系数,n\vec{n}:表面法线 l\vec{l}:光源方向(指向光源)

Half Lambert

使用Lambert漫反射光照模型有一个缺点:背光面明暗一样,看起来想一个平面一样,失去了模型细节。于是一种改善的技术提了出来:半兰伯特(Half Lambert)光照模型。

  • 广义的半兰伯特光照模型公式:

cdiffuse=(clightmdiffuse)(a(nl)+b)c_{diffuse} = (c_{light} \cdot m_{diffuse})(a(\vec{n} \cdot \vec{l}) + b)

绝大多是情况下aabb的值均为0.5。

Phong

早期的游戏引擎中往往只有一个光照模型,就是标准光照模型。标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后经过物体表面的一次反射直接进入摄像机的光线。

因为裴祥风(Bui Tuong Phong)首先提出了使用漫反射和高光反射的和来对反射光照进行建模的基本思想,并且提出了基于经验的计算高光反射的方法。所以标准光照模型也被称为Phong光照模型

它的计算方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度:

  • 自发光(emissive),用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。

cemissive=memissivec_{emissive} = m_{emissive}

memissivem_{emissive}是材质的自发光颜色。

  • 高光反射(specular),用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
在这里插入图片描述

使用Phong模型计算高光反射, 图片来源

计算公式:

cspecular=(clightmspecular)max(0,vr)mglossc_{specular} = (c_{light} \cdot m_{specular})max(0, \vec{v} \cdot \vec{r} ) ^{m_{gloss}}

这就是Phong提出的基于经验的高光反射模型。其中:clightc_{light}:入射光线的颜色和强度,mspecularm_{specular}:材质的高光反射颜色,v\vec{v}:视角方向(指向摄像机) ,r\vec{r}:光线反射方向,mglossm_{gloss}:材质的光泽度(gloss),也被称为反光度(shiness)。

反射方向r\vec{r}计算方法:

r=2(nl)nl\vec{r} = 2(\vec{n} \cdot \vec{l}) \vec{n} - \vec{l}

  • 漫反射(diffuse),用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
    即上面的Lambert定律:

cdiffuse=(clightmdiffuse)max(0,nl)c_{diffuse} = (c_{light} \cdot m_{diffuse})max(0,\vec{n} \cdot \vec{l})

  • 环境光(ambient),用于描述其他所有的间接光照。

cambient=gambientc_{ambient} = g_{ambient}

环境光gambientg_{ambient}通常是一个全局变量,即场景中的所有物体都使用了这个环境光。

Blinn Phong

Blinn提出了一个简单的修改方法来得到与Phong高光反射模型类似的效果,它的基本思想是,避免计算反射方向r\vec{r}。Blinn模型引入了一个新的矢量h\vec{h}。计算方法为:

h=v+lv+l\vec{h} = \frac{ \vec{v} + \vec{l} }{ | \vec{v} + \vec{l} | }

然后使用n\vec{n}h\vec{h}之间的夹角进行计算,而非v\vec{v}r\vec{r}之间的夹角。

在这里插入图片描述

Blinn模型 图片来源

Blinn模型的公式:

cspecular=(clightmspecular)max(0,nh)mglossc_{specular} = (c_{light} \cdot m_{specular})max(0, \vec{n} \cdot \vec{h} ) ^{m_{gloss}}