在渲染器光栅化每个三角形的过程中,需要对根据顶点属性对三角形进行扫描线插值。此时由于投影面上顶点的2D坐标与顶点属性不成线性关系,因此是不能简单地使用线性插值来计算顶点属性的。

此时应当利用透视校正插值(Perspective-Correct Interpolation)来计算。

设3D空间中存在一条线段,它的两个端点为A和B,3D坐标分别为(x1,y1,z1)和(x2,y2,z2)。这两点投影到camera坐标系投影面的两点为a(p1,q1)、b(p2,q2)。那么:

设该线段之间存在一个三维点C(投影到2D平面时我们用小写c表示),它的三维和二维坐标分别为(x3,y3,z3)、(p3,q3),

c=(1-t)a+tb。则可以证明

1/z3=(1-t)*(1/z1)+t*(1/z2) (1)

因为在网格模型中顶点属性与顶点的坐标值成线性关系,因此可以利用求出的z值来计算相应的顶点属性。

举个例子,假设我们已知3D空间的两个端点A和B,要求出该线段投影到视平面上2D线段的中点所对应的3D坐标。可以先利用公式(1)推导出该点的z坐标(t已知为1/2),

然后接下来有两种方法:

1、计算t1=(z3-z1)/(z2-z1),然后可以得到x3=t1*(x2-x1)+x1,y3以此类推。

2、根据x3/z3=t*x2/z2+(1-t)*x1/z1得到x3,y3同理。

这两种方法经我推导证明得到的结果是一样的。

具体的推导可以件这两篇博客:

http://blog.csdn.net/popy007/article/details/5556639

http://blog.csdn.net/popy007/article/details/5570803

透视校正插值(Perspective-Correct Interpolation)的更多相关文章

  1. 三次样条插值 cubic spline interpolation

    什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...

  2. uniapp属性插值报错Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead.

    解决方法: 因为vue 2.x不支持对属性使用插值{{}}的方式赋值,所以要使用v-bind指令(或简写“:”)来指定属性. v-bind指令 v-bind:id="item.id" ...

  3. 平滑算法:三次样条插值(Cubic Spline Interpolation)

    https://blog.csdn.net/left_la/article/details/6347373 感谢强大的google翻译. 我从中认识到了航位推算dead reckoning,立方体样条 ...

  4. Direct3D11学习:(六)渲染管线

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 这篇文章主要讲解渲染管线(rendering pipeline)的理论知识. 渲染管线是指:在给定一个3D场景的 ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  6. 可编程渲染管线(Scriptable Render Pipeline, SRP)

    原文链接 可编程渲染管线处理数据的流程可分为以下3大阶段 1. 应用阶段 这个阶段大概会由CPU处理4件事情.首先会对模型数据进行可见性判断.模型数据由顶点位置.法线方向.顶点颜色.纹理坐标等构成.然 ...

  7. Soft Renderer的乐趣

    最近这一个月的闲暇时间在边学习<3D编程大师技巧>边做自己的Soft Renderer,一个月下来总算有了个“基本原型”的样子.主要是在编写图形管线的过程式代码,简单明了为第一个阶段的目标 ...

  8. Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

    摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...

  9. DirectX12 3D 游戏开发与实战第五章内容

    渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...

随机推荐

  1. oracle中存储过程中调用存储过程

    存储过程中调用存储过程 create or replace package body PF_Role_Pack is procedure sp_GetPage_Role(pageSize_ in nu ...

  2. MagicalRecord的使用(第三方库实现的数据库)

    MagicalRecord:http://cocoadocs.org/docsets/MagicalRecord/2.1/ 安装: 1.新建一个工程,注意不要勾选 Core Data. 2.利用Coc ...

  3. C++ explicit关键字应用方法详解

    C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用.我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字.下面就让我们一起来看看这方面的知识吧. C++ ...

  4. php超全局数组变量

    (1)$_SERVER 服务器的相关信息 (2)$_GET 接收用户通过url向服务器传的参数  $POST 接收用户通过http协议向服务器传递的参数 发送get请求 <a href=&quo ...

  5. DDOS的攻击原理和防护指南(转)

    DDOS的攻击原理和防护指南 作者:冰盾防火墙 网站:www.bingdun.com 日期:2008-01-07   我们现在来分析DDOS的攻击原理.     首先,DDOS是英文Distribut ...

  6. Android Studio 1.5错误

    Error:Unable to start the daemon process: could not reserve enough space for object heap. Please ass ...

  7. Jmeter—2 http请求—简单的get请求

    发送一个简单的get http请求 1 启动Jmeter,在测试计划上点击鼠标右键>添加>Threads(Users)>线程组 2 线程组界面.可设置线程数,几秒启动所有线程,循环次 ...

  8. <s:textfield>标签

    中的value=“”还是挺有用的,比如说更新之前,根据需要更新的用户(地址.商品等等等等)的id,在updateInput方法中,先做一些准备,根据这个id去数据库取属性出来,放到ActionCont ...

  9. cassandra中对节点失败与否的探测方法, the Phi accrual Failure Dector,附论文

    (1)在分布式系统中,对于某个节点是否还“活着”的探测,通常是设定一个时间的阀值,然后根据接收到的“心跳”信息的间隔,来判定这个节点是否还活着,然后返回一个bool值: 但这种做法很容易造成误判:因为 ...

  10. C#实现微信公众号群发消息(解决一天只能发一次的限制)

    经过几天研究网上的代码和谢灿大神的帮忙,今天终于用C#实现了微信公众号群发消息,现在整理一下. 总体思路:1.首先必须要在微信公众平台上申请一个公众号. 2.然后进行模拟登陆.(由于我对http传输原 ...