设直线方程为: a * y + b * z = c
根据相似三角形: p / y = d / z
==> y = p / d * z
代入直线方程得: a * p / d * z + b * z = c
==> z = c / (a * p / d + b)
==> 1 / z = (a * p / d + b) / c = (a / (c * d)) * p + b / c
设 k = (a/(c*d)) 且 m = b / c
==> 1 / z = k * p + m
点(y1, z1)的投影点为(p1, d)
点(y2, z2)的投影点为(p2, d)
==> 1 / z1 = k * p1 + m
1 / z2 = k * p2 + m
对屏幕点p插值: p = (1-t) * p1 + t * p2
代入公式: 1 / z = k * p + m
= k * ( (1-t) * p1 + t * p2) + m
= (1-t) * k * p1 + t * k * p2 + m
= (1-t) * k * p1 + t * k * p2 + m - t * m + t * m
= (1-t) * k * p1 + (1-t) * m + t * k * p2 + t * m
= (1-t) * (k * p1 + m) + t * (k * p2 + m)
= (1-t) * (1 / z1) + t * (1 / z2)
所以在屏幕空间1 / z是线性变化的,而z不是
用上述公式来进行纹理坐标插值:
u / z = (1-t) * (u1 / z1) + t * (u2 / z2)
v / z = (1-t) * (v1 / z1) + t * (v2 / z2)结果都乘以z,就能得到当前象素的正确纹理坐标