码迷,mamicode.com
首页 > 其他好文 > 详细

透视校正插值

时间:2020-02-07 20:34:28      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:math   深度   投影   class   splay   属性   计算   颜色   假设   

在投影变换视口变换后,需要对投影到屏幕上的平面三角形顶点属性进行线性插值,例如颜色,纹理,深度等。但对于投影前在3D空间的三角形来说,这个插值并不是线性的。下面来推导一下这个插值。

假设屏幕空间的三角形的三个顶点分别为\(v_0,v_1,v_2\)\(v_p\)是位于三角形一边上的点\(v_0 + t(v_1 - v_0)\)

那么有:
\[ x_p = x_0 + t(x_1 - x_0) \]
其中,$ 0 \leq t \leq 1$。对于投影前的三角形,根据投影变换则有:
\[ \dfrac{x'}{x} = \dfrac{z'}{d} \]
其中,\(x',z'\)为投影前三角形的坐标,\(d\)为到投影平面的距离。代入可得:
\[ \dfrac{x'_p}{z'_p} = \dfrac{x'_0}{z'_0} + t(\dfrac{x'_1}{z'_1} - \dfrac{x'_0}{z'_0}) \]
另外,我们已知\(v'_0,v'_1,v'_p\)三点共线,假设直线方程为\(ax'+bz'=c\),代入化简可得到:
\[ \dfrac{1}{z'_p} = \dfrac{1}{z'_0} + t(\dfrac{1}{z'_1} - \dfrac{1}{z'_0}) \]
可见,对于投影前在3D空间的三角形来说,\(z\)的倒数成线性插值。这样,我们就可以根据屏幕空间三角形的顶点深度,插值计算出三角形内任意点的深度值。

同样地,对于其他属性\(m'\)例如颜色纹理等,它们都关于深度\(z'\)成线性关系,即都有\(am'+bz'=c\)。等式两边都除以\(cz'\)得到:
\[ \dfrac{am'}{cz'} + \dfrac{b}{c} = \dfrac{1}{z'} \]
根据之前求得的结果,有:
\[ \dfrac{am'_p}{cz'_p} + \dfrac{b}{c} = \dfrac{am'_0}{cz'_0} + \dfrac{b}{c} + t(\dfrac{am'_1}{cz'_1} - \dfrac{am'_0}{cz'_0}) \]
化简得到:
\[ \dfrac{m'_p}{z'_p} = \dfrac{m'_0}{z'_0} + t(\dfrac{m'_1}{z'_1} - \dfrac{m'_0}{z'_0}) \]
可见,对于投影前在3D空间的三角形来说,其他属性乘以\(z\)的倒数成线性插值。这样,我们就可以根据屏幕空间三角形的顶点属性,插值计算出三角形内任意点的属性值。

透视校正插值

标签:math   深度   投影   class   splay   属性   计算   颜色   假设   

原文地址:https://www.cnblogs.com/back-to-the-past/p/12274314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!