线性插值(linear interpolation,常简称 lerp)是在两个已知值之间按比例取中间值的计算。给定两个端点 aa、bb 和一个参数 tt,插值结果为:

lerp(a,b,t)=a+t (b−a)=(1−t) a+t blerp(a, b, t) = a + t\,(b - a) = (1 - t)\,a + t\,b

  • t=0t = 0 得到 aa,t=1t = 1 得到 bb,t=0.5t = 0.5 得到中点
  • 两个权重 (1−t)(1 - t) 与 tt 之和恒为 1,所以本质是加权平均(weighted average)

图形学里最常用到它的地方是光栅化:三角形内部的片元属性(颜色、法线、UV、深度等)都由顶点属性插值而来。

  • 如果要把两个端点的情形推广到三角形三个顶点,权重会变成三个,处理方法是采用 重心坐标。

注:对于 w≠1w \neq 1 的 齐次坐标 直接进行线性差值,会得到非线性的成果:

  1. 对于 (x1,y1,z1,w1)(x_1, y_1, z_1, w_1) 和 (x2,y2,z2,w2)(x_2, y_2, z_2, w_2),直接线性插值进行计算:

    x=(1−t)x1+tx2y=(1−t)y1+ty2z=(1−t)z1+tz2w=(1−t)w1+tw2x = (1 - t) x_1 + t x_2 \\ y = (1 - t) y_1 + t y_2 \\ z = (1 - t) z_1 + t z_2 \\ w = (1 - t) w_1 + t w_2

最终的坐标除以 w 进行归一化后,得到的结果是:

((1−t)x1+tx2(1−t)w1+tw2,(1−t)y1+ty2(1−t)w1+tw2,(1−t)z1+tz2(1−t)w1+tw2)(\frac{(1 - t) x_1 + t x_2}{(1 - t) w_1 + t w_2}, \frac{(1 - t) y_1 + t y_2}{(1 - t) w_1 + t w_2}, \frac{(1 - t) z_1 + t z_2}{(1 - t) w_1 + t w_2})

  1. 先对两个顶点进行透视除法,得到 (x1w1,y1w1,z1w1)(\frac{x_1}{w_1}, \frac{y_1}{w_1}, \frac{z_1}{w_1}) 和 (x2w2,y2w2,z2w2)(\frac{x_2}{w_2}, \frac{y_2}{w_2}, \frac{z_2}{w_2}),再进行线性插值:

(1−t)(x1w1,y1w1,z1w1)+t(x2w2,y2w2,z2w2)=((1−t)x1w1+tx2w2,(1−t)y1w1+ty2w2,(1−t)z1w1+tz2w2)(1 - t)(\frac{x_1}{w_1}, \frac{y_1}{w_1}, \frac{z_1}{w_1}) + t(\frac{x_2}{w_2}, \frac{y_2}{w_2}, \frac{z_2}{w_2}) = (\frac{(1 - t) x_1}{w_1} + \frac{t x_2}{w_2}, \frac{(1 - t) y_1}{w_1} + \frac{t y_2}{w_2}, \frac{(1 - t) z_1}{w_1} + \frac{t z_2}{w_2})