惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
小众软件
小众软件
H
Help Net Security
博客园 - 聂微东
宝玉的分享
宝玉的分享
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
U
Unit 42
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
腾讯CDC
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
J
Java Code Geeks
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News

博客园 - 任程

运动捕捉数据的行为分割 主元分析(PCA)在计算机图形学中的应用 本博客代码公布(本文会不断更新) 机器人逆动力学(Robot Inverse Dynamics) 刚体动力学(Rigid Body Dynamics) Flock of Birds——总结使用过的虚拟现实设备之二(A Brief Summary of Several VR Devices) 多通道软件同步——代码设计 多通道的同步问题 《自己实现EarthSculptor的Splatting地形》的源代码 Interesting story about DI-Guy 利用billboard实现云的仿真 OST试验版 Ogre中在SceneNode节点旁显示二维字的代码 Perlin噪声 虚拟现实现状——设备篇(译:State of VR-Devices) 多线程中Sleep函数的调用 用WiiRemote进行头部跟踪(Head Tracking for Desktop VR Displays using the WiiRemote) 分析碰撞检测库Opcode 用NVPerfHUD来分析3D程序
透视校正插值(Perspective-Correct Interpolation)
任程 · 2008-03-13 · via 博客园 - 任程

    在3D图形处理器绘制三角形时,每个像素处的属性信息(包括颜色、纹理坐标等)是对扫描线左右端点对应的顶点属性信息进行插值运算得到的。

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

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

    可以证明,深度值z坐标的倒数恰好是按线性方式进行插值的:如上图,眼坐标系下端点坐标为,其在投影面上投影坐标为如果有一个插值点

,则其眼坐标系下的深度值关系为式(1):

                          (1)

    推导过程见《3D游戏与计算机图形学中的数学方法》66页,或英文版《Mathematics for 3D Game Programming and Computer GraphicsSecond Edition, pp118

在网格模型中顶点属性是与顶点的坐标值成线性关系,因此利用此特性对顶点属性如纹理坐标进行插值:

                         (2)

     其中由上述公式(1)计算得到。

     一般我们的顶点程序计算完的坐标都是投影坐标下的,那么我们的显卡是如何知道顶点在眼坐标下的z坐标的呢?看看我们的投影矩阵吧。OpenGLglFrustum()函数的生成的透视投影矩阵如下:

    一个眼坐标系下的顶点(x,y,z,w)乘完这个透视投影矩阵后成为(x',y',z',w'),我们发现w'坐标就等于原眼坐标系下z坐标的负值-z。这样显卡在对顶点属性进行插值时就利用这个w'坐标来进行z倒数的插值了。岂不妙哉?

    利用这些知识,我们来做一件事:知道三维空间中眼坐标系下一条线段的两个端点坐标,要求线段上一点使得其在投影面上的投影点在两个端点的投影点正中间,那么应该怎么求这个点呢?可不能是,而应该是先利用公式(1)z倒数进行插值得到z坐标,然后再对x/zy/z分别进行插值得到xy坐标。

ps:Blinn曾经对透视校正插值进行了深入讨论,他的三篇文章:“Hyperbolic Interpolation”,“Jim Blinn's coner:A Trip Down the Graphics Pipeline.","W Pleasure, W  Fun".