透视投影后的线性插值校正

许多着色方法都要用到顶点间的线性插值,譬如逐像素着色的Phong Shading往往需要进行纹理坐标等的线性插值。然而,透视投影会导致直接在屏幕空间进行线性插值得到的结果不正确,如下图:

clip_image002

在屏幕上进行的线性插值并不对应在物体上的线性插值,这将导致一系列与该插值相关的着色结果出现错误。譬如,如果在屏幕上直接插值纹理坐标,会得到下图中右边的结果(左边为正确的结果):

clip_image004

解决该问题的一种方式是利用clip_image006在屏幕空间的线性性。假设坐标为clip_image008clip_image010的点分别被投影到屏幕上坐标为clip_image012clip_image014的位置,直线clip_image016的方程为clip_image018,如下图:

clip_image020

若以clip_image022为原点,易见有

clip_image024

整理得

clip_image026

clip_image028代入方程clip_image030并整理可得

clip_image032

类似地,有以下方程成立:

clip_image034

类似的式子对clip_image036上的每一点及其投影点都成立。现考虑在clip_image038clip_image040间进行的线性插值clip_image042,有:

clip_image044

由此可知,在屏幕上进行的线性插值对应于在投影前空间中对clip_image006[1]的线性插值。现假设要在clip_image008[1]clip_image010[1]间对属性值clip_image046clip_image048进行线性插值得到clip_image050,易知——

clip_image052

整理得

clip_image054

现在屏幕空间对clip_image006[2]进行线性插值,即

clip_image056

将上式代入clip_image050[1]表达式得

clip_image058

这就得到了正确的对clip_image060插值的方法:在屏幕空间中对clip_image006[3]clip_image062分别进行线性插值得到clip_image064clip_image066,然后用后者除以前者,即得到clip_image050[2]

以上推导仅考虑了clip_image068clip_image070坐标,现考虑三角形clip_image072上进行的线性插值,假设屏幕上线性插值的权重为clip_image074clip_image076,真实三角形上对应的权重为clip_image078clip_image080,故有

clip_image082

clip_image084

clip_image086

注意到clip_image088clip_image090,代入得到

clip_image082[1]

clip_image092

clip_image094

解得

clip_image096

clip_image098

这就得到了根据clip_image100求出clip_image102的公式。由于在透视投影变换后、坐标齐次化之前,clip_image070[1]clip_image104的比值是一定的,因此上面两个公式中的clip_image070[2]坐标均可换成透视投影变换后、坐标齐次化之前对应的clip_image104[1]坐标。

posted on 2016-12-31 21:26  AirGuanZ  阅读(1415)  评论(0编辑  收藏  举报

导航