原文见:http://www.cnblogs.com/Pointer/archive/2004/12/20/79323.html
最近通过学习固定渲染管线的光栅化过程,终于明白了扭曲的原因。
我们先设V=投影变换前的顶点,V'=投影变换后的齐次顶点。
在屏幕空间中,V的各项属性并不是线性分布的,但1/Vz是线性分布的,对于其它的顶点属性Vb/Vz也是线性分布的(《Mathematics for 3D Game Programming & Computer Graphics》上有详细的证明),所以我们进行插值的时候应该先对1/Vz进行线性插值,然后对Vb/Vz也进行线性插值,最后将Vb/Vz的插值结果乘以1/Vz插值结果的倒数,得到Vb的插值结果。
又因为V'w= -Vz(推导见投影矩阵的推导),所以我们一般用1/V'w来替代1/Vz。
而我在进行纹理投影的时候,将投影变换后的齐次顶点坐标投影到了三维的空间中(即:<V'x/V'w, V'y/V'w, V'z/V'w>),然后用glVertex3f将该坐标传入了固定渲染管线,这样的话就使得纹理坐标的插值由非线性插值变为了线性插值,导致了最终结果的扭曲。
其实直接用glVertex4f将V'传入固定渲染管线,由固定渲染管线进行透视矫正的话,即可消除这种扭曲现象。