标准光照模型
1、1975年Phong提出了标准光照模型的基本概念。
标准光照模型只关心直接光照(direct light),也就是直接从光源发射出来照射到物体表面之后,经过物体表面的一次反射直接进入摄像机的光线。标准光照模型被分为4部分:
(1)自发光(emissive),描述的是当给定一个方向时一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination),技术,这些自发光的表面并不会真的照亮周围的物体,而是他本身看起来更亮了而已。
(2)高光发射(specular),用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
(3)漫反射(diffuse),用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量
(4)环境光(ambient),用来描述其他所有间接光照。
2、漫反射(diffuse)
漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。在漫反射中,视角的位置不是最重要的,因为反射完全随机,可以认为它在任意方向上的反射分布都是一样的,但是入射光线的角度很重要。
兰伯特定律(lambert law)
漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
半兰伯特光照模型(Half Lambert)
Valve公司在开发游戏《半条命》时提出的一种对兰伯特光照模型修改的技术——半兰伯特光照模型。
可以发现它不再是用max()函数来限定法线与入射光线反向的点积,而是先用α对点积进行缩放,然后再用β对缩放后的结果进行位移,当α和β都等于0.5时,结果会被限定到[0,1]之间,这样即便是物体后面的光照也会有明暗区分,而不是统一都变成0。
半兰伯特是没有任何物理依据的,仅仅是一个视觉加强技术
3、高光反射
Phong光照模型
其中r代表入射光经反射之后出射方向,gloss代表材质的光泽度(gloss),也叫反光度(shininess),它用于控制高光区域的“亮点”有多宽,gloss越大亮点越小。v是视角方向。
其中反射方向的计算方式如下:
Blinn-Phong光照模型
Blinn-Phong对Phong光照模型做了一点修改,通过引入一个新的矢量h,避免了计算反射方向r:
当摄像机和光源足够远时,Blinn-Phong是会快于Phong的,因为此时可以把视角v和光源I看成是定值,h则变成了常量。当v和i不是定值时,Phong可能还会快一些。这两个模型都是经验模型。Blinn在一些情况下更符合实验结果。但是Blinn-Phong有很多重要的物理现象无法表现出来,如菲涅尔反射(Fresnel reflection),而且Blinn-Phong是各项同性(isotropic)的,也就是当我们固定视角和光源时旋转这个表面时,反射不会发生任何改变,但是有些表面具有各向异性(anisotropic)反射性质的,如拉丝金属,毛发等。
4、逐像素还是逐顶点
逐像素光照(per-pixel lighting)
逐像素光照在片元着色器中计算光照,以每个像素为基础,得到它的法线(法线来自顶点法线的插值或是法线纹理采样),然后进行光照计算。这种在面片之间对顶点法线进行插值的技术被称为Phong着色(Phong Shading),也被称为Phong插值或法线插值着色技术。(不同于Phong光照模型)
逐顶点光照(per-vertex lighting)
逐顶点光照也被称为高洛德着色(Gourand shading),在每个顶点上计算光照,然后在渲染图元的时候会进行插值,最后输出像素颜色。由于顶点数目往往小于像素数目,所以逐顶点计算量一般会小于逐像素,但是逐顶点的光照依赖于线性插值计算得到像素颜色,所以逐顶点在计算非线性光照时会有问题,如高光反射。而且有于插值的原因会导致有顶点的像素颜色比没顶点的像素颜色要深。