深度插值与透视纹理映射插值
在模型空间,世界空间,相机空间和剪裁空间中三角面上的纹理坐标与空间坐标是线性关系,按空间坐标进行线性插值即可求得纹理坐标。
但在透视投影模式下在归一化设备空间和视口空间中纹理坐标与空间坐标就不再是线性关系了,要在归一化设备空间或视口空间插值计算纹理坐标,需要进行非线性插值。
其原因就在于透视投影模式下由剪裁空间到归一化设备空间进行了一步透视除法。
在光栅化过程中,我们通常都是要在视口空间进行纹理插值,所以我们这里重点推导视口空间中纹理坐标的插值方法。
设相机空间中的坐标为(x,y,z),其变换到剪裁空间中的坐标为(xc,yc,zc),经过透视除法变换到归一化设备空间(xd,yd,zd),然后再经过视口变换变换到视口空间(xv,yv,zv)。
有关系:(参考:http://user.qzone.qq.com/350479720/blog/1310060277)
(根据透视投影矩阵:)
xc=x*(cot(fovy/2)/aspect)
yc=y*cot(fovy/2)
zc=-(f+n)/(f-n)*z-2fn/(f-n)
wc=-z
(根据透视除法:)
xd=xc/wc
yd=yc/wc
zd=zc/wc
wd=1
(根据视口矩阵:)
xv=0.5*width*xd+vx+0.5*width (vx,vy为视口左下角坐标)
yv=0.5*height*yd+vy+0.5*height
zv=0.5*zd+0.5
根据相机空间中三角面上的x,y,z为线性关系,有:
Ax+By+Cz+D=0
两边除以z得:A(x/z)+B(x/z)+C+D/z=0 (1)
由于
xd=xc/wc=-x/z*(cot(fovy/2)/aspect)
yd=yc/wc=-y/z*cot(fovy/2)
zd=zc/wc=(f+n)/(f-n)+2fn/(f-n)*(1/z)
代入(1)式得:
A(-xd*aspect/cot(fovy/2))+B(-yd/cot(fovy/2))+C+D(zd-(f+n)/(f-n))(f-n)/(2fn)=0
合并一下常数项得:
A'*xd+B'*yd+C'+D'*zd=0,其中A',B',C',D'均为常数。
可见xd,yd,zd是线性关系。
又由于xv与xd是线性关系,yv与yd是线性关系,zv与zd是线性关系,所以xv,yv,zv是线性关系,即:
zv=L(xv,yv) -----(结论1)
所以视口空间里深度值可以能过线性插值计算。
再来看纹理坐标:
由于三角面在相机空间中纹理坐标与空间坐标是线性关系,所以有:
s=Ax+By+Cz+D。
两边除以z得:
s/z=A(x/z)+B(y/z)+C+D/z (2)
由于
xd=xc/wc=-x/z*(cot(fovy/2)/aspect)
yd=yc/wc=-y/z*cot(fovy/2)
zd=zc/wc=(f+n)/(f-n)+2fn/(f-n)*(1/z)
代入(2)式得:
s/z=A(-xd*aspect/cot(fovy/2))+B(-yd/cot(fovy/2))+C+D(zd-(f+n)/(f-n))(f-n)/(2fn)
合并一下常数项得:
s/z=A'*xd+B'*yd+C'+D'*zd,其中A',B',C',D'均为常数。
即s/z=L(xd,yd,zd)
由于xv与xd是线性关系,yv与yd是线性关系,zv与zd是线性关系,所以
s/z=L(xv,yv,zv)
由于zv=L(xv,yv),所以
s/z=L(xv,yv)
由于zd=(f+n)/(f-n)+2fn/(f-n)*(1/z)及zv=0.5*zd+0.5,所以1/z=((zv-0.5)*2-(f+n)/(f-n))*(f-n)/(2fn),代入上式得:
s*((zv-0.5)*2-(f+n)/(f-n))*(f-n)/(2fn)=L(xv,yv)
上式可简化为:s*(zv-f/(f-n))=L(xv,yv)
类似有:t*(zv-f/(f-n))=L(xv,yv)
----(结论2)
根据结论1和结论2就可以得到透视投影模式下在视口空间插值计算纹理坐标的方法了:
首先通过线性插值计算zv,然后通过线性插值计算s*(zv-f/(f-n))和t*(zv-f/(f-n)),设结果为S和T,则
s=S/(zv-f/(f-n))
t=T/(zv-f/(f-n))
这样就得到了透视正确的纹理坐标(s,t)。
----
参考:http://blog.csdn.net/popy007/article/details/5570803#reply
深度插值与透视纹理映射插值相关推荐
- 【重心坐标插值、透视矫正插值】原理以及用法见解(GAMES101深度测试部分讨论)
文章目录 1.Barycentric Coordinates(重心坐标) 1.1 重心坐标概念 1.2 重心坐标计算方式 1.3 重心坐标插值 2 重心坐标计算公式推导 3 透视投影插值矫正 3.1 ...
- 图形学基础之透视校正插值
透视校正插值 (Perspective-Correct Interpolation) 问题的提出 在使用光栅化的图形学方法中,法线,颜色,纹理坐标这些属性通常是绑定在图元的顶点上的.在3D空间中,这些 ...
- 深入探索透视纹理映射(下)
深入探索透视纹理映射(下) 我的建议:建议学习一下图形学的知识 计算机图形学 赵明.李振波 中国农业大学 公开课 第二讲 光栅图形学算法 http://www.icourse163.org/le ...
- 图像处理中的“内插”是什么?插值、图像内插值、图像间插值、重取样(用已知数据来估计未知位置的数值的处理)(最近邻内插法、双线性内插)
图像插值是在基于模型框架下,从低分辨率图像生成高分辨率图像的过程,用以恢复图像中所丢失的信息.图象插值方法有:最近邻插值,双线性插值,双平方插值,双立方插值以及其他高阶方法. 在很多情况下,人们需要对 ...
- 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)
文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...
- 插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值
插值:求过已知有限个数据点的近似函数. 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小. 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似 ...
- MATLAB一维插值和二维插值
插值问题描述:已知一个函数上的若干点,但函数具体表达式未知,现在要利用已知的若干点求在其他点处的函数值,这个过程就是插值的过程. 1.一维插值 一维插值就是给出y=f(x)上的点(x1,y1),(x2 ...
- 一元函数的插值c语言,一元函数插值-Read.doc
一元函数插值 目标: 对比插值和数据拟合的思想 一元函数插值(线性插值和抛物线插值)及程序实现 基本理论 插值:采集到的数据可以看作是精确数据,要求函数或曲线通过这些数据点. 常用插值方法:一元函数插 ...
- 【转】图形学基础之透视校正插值
原文链接:https://blog.csdn.net/n5/article/details/100148540
最新文章
- priorityqueue 的 add和offer方法有区别吗_日常在家安吉白茶应该如何去保存?城市与农村存放的方法有区别吗...
- [Qt入门]QTreeWidget控件创建
- Java并发编程以及并发须知的几个概念:什么是线程安全?
- python创建和删除文件有什么区别_python创建和删除文件
- 大话设计模式C++版——代理模式
- 一文全记录斐讯K3刷机+打印服务器+私人云盘+frp内网穿透+ftp远程上传下载
- 从美国人工智能年会看2017世界人工智能最新研究成果
- 淘宝京东的6位数字支付密码实现
- 浏览器下载文件时文件名中文乱码问题
- 如何使用中国知网查询文献,并自动生成参考文献格式引文?
- 大一作业HTML网页作业:简单的旅游 1页 (旅游主题)
- HbuildX H5+App监听手机返回键以及webview关闭
- Mask RCNN -- Mask Scoring R-CNN
- mysql函数名称顿号,快速统计一个单元格内有多少个名字,你不会是一个一个数的吧...
- 欢迎访问我的个人博客:www.zou8944.com
- java报错java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that
- LaTeX定制个人简历
- Internet浏览器64位Java插件使用方法
- 蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere
- CS285课程解释_01_为什么是深度强化学习