基本光照模型
漫反射模型(Lambert模型)
环境光:Iambdiff=Kd*Ia,其中Ia 表示环境光强度,Kd (0< Kd<1)为材质对环境光的反
射系数,Iambdiff是漫反射体与环境光交互反射的光强。
方向光:Ildiff = Kd * Il * cos(θ),其中Il是入射角,Ildiff是漫反射体与方向光交互反射
的光强。cos(θ)又等价于(点乘),其中是顶点的单位法向量,是顶点指
向光源的单位向量。
最后,将环境光与方向光综合,Lambert模型可写成:
Idiff = Iambdiff+ Ildiff = Kd* Ia+ Kd * Il*
镜面反射模型(Phong模型)
Phong模型认为镜面反射的光强与反射光线和视线的夹角相关:
Ispec = Ks * Il*
其中,Ks为镜面反射系数,Ns为高光指数,V表示从顶点到视点方向的单位向量,R表示反射光方向的单位向量。R可通过和L求出,
R=2-L
所以最终模型为:
Ispec=
修正镜面光模型(Blinn-Phong光照模型)
Blinn-Phong是一个基于Phong模型修正的模型,其公式为:
Ispec = Ks * Il*
其中N是入射点的单位法向量,H是光入射方向L和视点方向V的中间向量,通
常也称之为半角向量(半角向量被广泛用于各类光照模型,原因不但在于半角向量
蕴含的信息价值,也在于半角向量是很简单的计算:H = (L +V) / |L +V| 。
漫反射与镜面反射的合并
对于单个点光源:
I=Idiff+Ispec= Kd* Ia+ Kd* Il * + Ks* Il *
对于多个点光源:
I= Kd * Ia +
光线跟踪
基本光线跟踪算法
由于从光源发出的光线有无穷多条,使得直接从光源出发对光线进行跟踪变得非常困难。实际上,从光源发出的光线只有少数经由场景的反射和透射(折射)后到达观察者的眼中。为此标准光线跟踪算法采用逆向跟踪技术完成整个场景的绘制。
光线跟踪思路:从视点出发,通过图像平面上每个像素中心向场景发出一条光线,光线的起点为视点,方向为像素中心和视点连线单位向量。光线与离视点最近的场景物体表面交点有三种可能:
1. 当前交点所在的物体表面为理想漫射面,跟踪结束。
2. 当前交点所在的物体表面为理想镜面,光线沿其镜面发射方向继续跟踪。
3. 当前交点所在的物体表面为规则透射面,光线沿其规则透射方向继续跟踪。
按以上的思路逐个将相交的面加入到一个二叉光线跟踪树中。
辐射度光照模型
基本辐射度模型:
Bk=Ek = Ek
其中, 为表面j和k的形状因子,它是表面j到达表面k的辐射能与离开表面j的辐射能的比率。Hk为单位时间,单位面积上到达表面k的闭包内所有表面的辐射能总和。Bk为单位面积离开表面k的辐射能总速率。
逐步求精的辐射度方法:
伪代码如下:
for each patch k
foreach patch j
{
dRad=rho[j]*B[k]*F[j][k]*A[j]/A[k];
dB[j]=dB[j]+dRad;
B[j]=B[j]+dRad;
}
dB[k]=0;
明暗处理
Gouraud明暗处理:又称强度插值表面绘制。通过将在照明对象的表面上将光强进行线性插值来绘制多边形表面。使用时,需要进行以下计算:
1. 确定每个多边形的顶点处的平均单位法向量
2. 对于每个顶点根据光照模型来计算其光强度
3. 在多边形投影区域对顶点强度进行线性插值
Phong明暗处理:又称法向量插值绘制,与Gouraud方法不同,通过对法向量插值取代强度插值。其结果更精确,高光更真实,但需要更多计算。
1. 确定每个多边形的顶点处的平均单位法向量
2. 在多边形投影区域上对顶点法向量进行线性插值
3. 根据光照模型,使用插值的法向量,沿每条扫描线计算投影像素的光强