光栅化渲染(5)-透视矫正

  由于投影后比例的变化,在成像平面上插值计算出的颜色等属性值实际上也是存在偏差的。

透视矫正

  前面我们提到可以用重心坐标的方法来对三角形内部的点做属性的插值,来赋予各个像素相应的颜色等属性:

$$
C_p = \lambda_0 * C_0 + \lambda_1 * C_1 + \lambda_2 * C_2
$$

  其中$(\lambda_0, \lambda_1, \lambda_2)$为投影平面上插值这一点的重心坐标。

  但是在深度检测中我们考虑到由于投影后的比例变化,所以我们不能把投影平面上三角形某点的重心坐标直接作为空间三角形上对应点的重心坐标(Figure 1)。因此上面的颜色插值实际上也是存在偏差的。

figure 1

Figure 1

  我们通过投影平面上三角形的重心坐标推出了计算对应空间点深度的公式:

$$
\cfrac{1}{Z} = \cfrac{1}{Z_0}(1 - q) + \cfrac{1}{Z_1}q
$$

  现在我们可以通过深度来得到矫正后的颜色、纹理、法向量等其它空间点的属性(以颜色为例推导)。
  如图(Figure 2),假设三角形上两点的深度分别为 $Z_0$ 和 $Z_1$,它们的颜色属性分别为 $C_0$ 和 $C_1$,连接这两点,我们可以对连线上的任意一点做深度和颜色的插值。

figure 2

Figure 2

  由于深度和颜色除了属性名称外没有什么不同,所以它们的插值应该是相互之间成比例的(Equation 1):

$$
\cfrac{Z-Z_0}{Z_1-Z_0} = \cfrac{C-C_0}{C_1-C_0}
$$

  由深度公式我们可以得到 $Z$ 的表达式(Equation 2):

$$
Z = \cfrac{1}{\cfrac{1}{Z_0}(1 - q) + \cfrac{1}{Z_1}q}
$$

  把(Equation 2)带入(Equation 1)左式中化简得:

formula1

  现在我们可以求得 $C$ 的表达式:

formula2

  进一步我们可以从右式中提出 $Z$,得到更简洁的形式:

formula3

  至此,我们得到了矫正后的颜色属性。同样的方法可以用来矫正插值点的纹理坐标、法向量等其它属性。