8.2.2 高若德(Gouraud)明暗绘制方法

��高若德明暗绘制方法的基本思想是:先计算多边形各个顶点的光强,然后通过双线性插值,计算出多边形内各点的光强。其基本的算法步骤为:
��1) 计算多边形顶点的平均法向(见图8.4);
��2) 根据基本光照模型计算顶点的平均光强;
��3) 通过线性插值,计算多边形的边上的各点光强;
��4) 通过线性插值,计算多边形内各点的光强。
��假定我们用多面体来近似表示某一个曲面体,已知多面体的各个多边形表面的顶点和法向量,则我们必须用多边形间的几何信息与拓扑信息来计算顶点的法向量。对每一个顶点,可取共享该顶点的各多边形法向量的平均值作为该顶点处曲面的法向量,然后把该法向量代入光照明模型计算出顶点处曲面的光亮度。假设顶点A相邻的多边形有k个,其法向分别为Ni, i=0,1,…,k-1, 则顶点a的单位法向量为:
��
��如图所示,顶点处的法向量可取共享该顶点的各多边形的单位法向量的平均值:

���
其中, 分别为四边形A、B、C和D的法矢量。

  在采用扫描线算法对上述多边形进行绘制时,先用多边形顶点的光亮度线性插值出当前扫描线与多边形的边界线的交点处的光亮度值,然后再用交点的光亮度线性插值出多边形与扫描线相交区段上每一采样点的光亮度值。 在视平面上,假设一多边形在视平面上的投影为V1V2V3V4,如图8.5所示。一扫描线与多边形的投影边界线相交于ab两点, P是投影于该扫描线上V5V6之间一象素中心的多边形采样点,四个顶点V1V2V3V4的光亮度分别为I1I2I3I4;取V5点的光亮度I5I1I2的线性插值,V6点的光亮度I6I1I4的线性插值,则P点出的光亮度IPIaIb的线性插值,即:

I5=uI1+(1-u)I2,   u=(Y5-Y2)/(Y1-Y2);

I6=vI1+(1-v)I4,   v=( Y6-Y4 )/(Y1-Y4);

IP=tI5+(1-t)I6,   t=(Xp-X6)/(X5- X6)。

  两条相邻的扫描线与同一条边的交点的光强度值可以用增量法来递推计算。如图8.6所示,设Y坐标分别为yy-1的两条扫描线与多边形的边V1V2的交点的光亮度值分别为I5I,则

类似地,我们也可以用增量法来递推计算后继扫描线与多边形的其它边(如V1V4)的交点的光亮度值。
��当采用彩色进行绘制时,上述计算必须对RGB三基色分别进行。
��双线性光强插值方法的优点:1)计算量小;2)可以得到连续的曲面光强。它的缺点是:它使得物体的高光部位变得模糊,面上的高光有时甚至出现异常形状;线性光强插值有时会造成表面出现过亮或过暗的条纹,称为马赫带(Mach-band)效应,图形的真实感降低。可以通过把表面再分割成更小的多边形等方法来消除这些问题,或者采用其它的方法,譬如冯氏明暗处理方法。
��由于高若德明暗绘制方法的计算量较小,并且产生的图形一般都比较好,所以,OpenGL实现了这种双线性光强插值算法。下面三个图分别是一头牛的多边形网格、等光强明暗绘制和高若德明暗绘制方法生成的图形。可见,高若德明暗绘制方法可以生成比较光滑的曲面效果。