美文网首页
3D数学-透视校正插值

3D数学-透视校正插值

作者: Colocasia | 来源:发表于2020-08-08 22:54 被阅读0次

3D数学-透视校正插值

好记性不如烂笔头啊,还是记录一下!


3D渲染中,输入数据是一些primitive信息,包括顶点位置、颜色、纹理坐标等等。在光栅化阶段,primitive(一般为三角形)被转化成一系列的fragment(或者称为像素),这些fragment接下来要做ps操作,此时每个fragment都有位置、颜色、纹理坐标这些属性信息,这些属性信息通过顶点属性用插值方法得到的。

如下图所示对投影面上相等的空间步长LR,它们在三角形面上对应的步长会随着离摄像机的距离的增加而变长,即L'>R'。因此对于处于LR之间的那个像素点,虽然在投影面上其坐标处于p_{1}p_{2}之间的\frac{3}{4}处,但是其在眼空间中的对应点并非处于x_{1}x_{2}之间的\frac{3}{4}处,而顶点的属性信息却又都是在投影变换前的空间中指定的。

因此对像素属性信息的插值不能是简单的线性,尤其是纹理坐标在用线性插值时会出现明显的失真。那么应该怎么办呢?方法就是如下的透视校正插值

3D数学-透视校正插值_1.png

那么如何得到均匀的顶点属性插值呢?稍等一下,我们先看看深度插值:

3D数学-透视校正插值_2.png

假设投射的直线是:
ax+bz=c
对于该直线上的一点<x,z>,从O点(相机位置)发出一束光线照射到该点,则光线与投影平面的交点为<p,-e>(投影平面的z值始终为-e),由于三角形相似原理可得出以下关系式:
\frac{p}{x}=\frac{-e}{z}
解出x得:
x=-\frac{pz}{e}
带入道直线方程ax+bz=c中可得:
(-\frac{ap}{e}+b)z=c
转化为:
\frac{1}{z} = -\frac{ap}{ce} + \frac{b}{c}
考虑线段的两个端点<x_{1},z_{1}><x_{2},z_{2}>,以及它们在投影平面上得对应点<p_{1},-e><p_{2},-e>,假设p_{3}=(1-t)p_{1}+tp_{2}(0 \le t \le 1),则p_{3}是点<p_{1},-e><p_{2},-e>在投影平面上得线性插值点的x值,则z值为:
\frac{1}{z_{3}} = -\frac{ap_{3}}{ce} + \frac{b}{c} \\ \qquad \qquad \qquad \quad \; \; = -\frac{ap_{1}}{ce}(1-t) - \frac{ap_{2}}{ce}t + \frac{b}{c} \\ \qquad \qquad \qquad \qquad \qquad \quad =(-\frac{ap_{3}}{ce} + \frac{b}{c})(1-t) + (\frac{ap_{2}}{ce} + \frac{b}{c})t \\ \qquad \quad \; \, = \frac{1}{z_{1}}(1-t) + \frac{1}{z_{2}}t
可见,z的倒数是线性插值,所以我们可以用顶点的z值来插值求得primitive内部fragment的属性值,比如颜色等等。
假定<x_{1},z_{1}>的颜色为b_{1}, <x_{2},z_{2}>的颜色为把b_{2},则<x,z>的颜色为b_{3}为:
\frac{b_{3}-b_{1}}{b_{2}-b_{1}} = \frac{z_{3}-z_{1}}{z_{2}-z_{1}}
根据:
z_{3} = \frac{1}{\frac{1}{z_{1}}(1-t) + \frac{1}{z_{2}}t}
可解得:
b_{3} = \frac{b_{1}z_{2}(1-t)+b_{2}z_{1}t}{z_{2}(1-t)+z_{1}t} \\ = \frac{\frac{b_{1}}{z_{1}}(1-t)+\frac{b_{2}}{z_{2}}t}{\frac{1}{z_{1}}(1-t)+\frac{1}{z_{2}}t} \;\,\\ \quad = z_{3}[\frac{b_{1}}{z_{1}}(1-t)+\frac{b_{2}}{z_{2}}t]
转化一下为:
\frac{b_{3}}{z_{3}} = \frac{b_{1}}{z_{1}}(1-t)+\frac{b_{2}}{z_{2}}t
由此可见用深度倒数来插值顶点属性是合适的。

也许有人看得比较晕,几何的证明更直观,更能使你看到结论的本质所在。

附上一个几何证明:

3D数学-透视校正插值_3.jpg

图中有一处错误为\frac{E'F}{FG'}=\frac{EF}{FG}=k

本节教程就到此结束,希望大家继续阅读我之后的教程。

谢谢大家,再见!


饮水思源

参考文献:

《3D游戏与图形学中得数学方法》

https://www.cnblogs.com/arenak/archive/2008/03/13/1103532.html
https://www.cnblogs.com/mikewolf2002/archive/2012/11/25/2787480.html
https://www.cnblogs.com/cys12345/archive/2009/03/16/1413821.html


版权声明:原创技术文章,撰写不易,转载请注明出处!

相关文章

  • 3D数学-透视校正插值

    3D数学-透视校正插值 好记性不如烂笔头啊,还是记录一下! 在3D渲染中,输入数据是一些primitive信息,包...

  • Unity基础【唐老狮】(一)3D数学基础,向量

    Unity基础 概述&个人总结 基础知识点 3D数学-基础 基础数学函数 插值运算Lerp:根据系数输出中间值先快...

  • 3D数学-透视投影

    3D数学-透视投影 好记性不如烂笔头啊,还是记录一下! 概述 投影变换完成的是如何将三维模型显示到二维视口上,这是...

  • 【数学】线性插值

    线性插值有一阶、二阶、三阶,对应为单线性插值、双线性插值和三线性插值。三者皆为线性插值,不同之处在于单线性插值为2...

  • 缺失值处理-拉格朗日插值

    常用的插值法有:一维插值法:拉格朗日插值、牛顿插值、分段低次插值、埃尔米特插值、样条插值。二维插值法:双线性插值、...

  • 【数学建模算法】(24)插值与拟合:牛顿插值

    首先需要提出差商,差分的概念和性质 1.差商 定义:设有函数为一系列互不相等的点,称为关于点一阶差商(也称均差)记...

  • 数学建模之插值法

    大概的意思是找一个近似函数来近似表达真实函数。表示方法:我们可以在若干个不同的地方得到相应的观测值,然后可以找到一...

  • SimpleITK 3D图像插值

    https://blog.csdn.net/weixin_42338058/article/details/101...

  • CSS3 卡牌翻转

    基本结构 舞台元素:用于制作3D空间,并且也可以添加perspective来修改透视的值(舞台元素不能使用over...

  • 2018-05-29透视投影的原理和实现

    摘要:透视投影是3D渲染的基本概念,也是3D程序设计的基础。掌握透视投影的原理对于深入理解其他3D渲染管线具有重要...

网友评论

      本文标题:3D数学-透视校正插值

      本文链接:https://www.haomeiwen.com/subject/dsekdktx.html