法线向量
1. 平面向量与表面向量的区别
平面法线(face normal)是描述多边形所朝方向的单位向量(即,它与多边形上的所有点相互垂直),如下图a所示。表面法线(surface normal)是与物体表面上的点的正切平面(tangent plane)相互垂直的单位向量,如下图b所示。表面法线确定了表面上的点“面对”的方向。
当进行光照计算时,我们必须为三角形网格表面上的每个点求解表面法线,以确定光线与网格表面在该点位置上的入射角度。为了获得表面法线,我们必须为每个顶点指定表面法线(这些法线称为顶点法线)。然后在光栅化阶段,这些顶点法线会在三角形表面上进行线性插值,使三角形表面上的每个点都获得一个表面法线。
(p0和p1是线段的两个顶点,n0和n1是对应的顶点法线。点p是通过线性插值(加权平均值)得到的线段上的一点,n是点p的法线向量,它介于两个顶点法线之间。也就是,当存在一个位置使p =p0 + t (p1 –p0 ) 时,n =n0 + t(n1 –n0)。为了简单起见,我们只解释了线段的法线插值,但是这一概念可以被直接扩展为3D三角形的法线插值。)
注意:对每个像素的法线进行插值,并进行光照计算称为逐像素光照或phong光照。还有一种负担较轻,但不够精确的方法是对每个顶点进行光照运算,称为逐顶点光照,计算结果是从顶点着色器中输出的,在像素着色器中进行插值。将计算从像素着色器转移到顶点着色器是一种常见的性能优化措施,而且在很多情况下的视觉表现与逐像素光照差别不大。
2. 如何计算平面法线向量和表面法向向量?
为了求解一个三角形Δp0p1p2的平面法线,我们必须先计算该三角形边上的两个向量:
u = p1− p0
v = p2− p0
然后求得平面法线为: