博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
透视校正插值
阅读量:6655 次
发布时间:2019-06-25

本文共 1679 字,大约阅读时间需要 5 分钟。

透视校正插值

当图形处理器在屏幕上显示一个三角形时,是需要进行逐行的光栅化。三角形顶点除了含有位置信息外,还包含颜色、纹理等属性信息,当然这类信息也需要进行插值。由于投影平面上的相同步长随着三角形面与相机距离的增加而在三角形面上产生更大的步长。图形处理需要采用非线性插值方式来计算相关属性信息才能获得正确的结果。

mark

深度插值

mark

如下图所示,\(x-z\) 平面上存在一条与三角形的某一个扫描线对应的线段,假如该线段不通过原点,则该线段方程可以表达为:
\[ax + bz = c , c \neq 0 \]
对于该条直线上的一点\((x,z)\),从做坐标原点发出的光线到该点,通过计算可以获得投影平面的交点,这个交点的\(z\)坐标固定为\(e\),假设其\(x\)坐标为\(p\),通过几何关系可以计算出\((x,z)\)\(p\)的关系
\[\frac{p}{x} = \frac{-e}{z} \rightarrow x = -\frac{p}{e}z \]
将公式带入带线段方程可得:
\[(-\frac{p}{e} + b)z = c \rightarrow \frac{1}{z} = -\frac{p}{ec} + \frac{b}{c}\]

考虑线段上两个端点\((x_1 , y_1)\) , \((x_2 , y_2)\) 以及它们在投影平面上的对应点\((p_1 ,e)\) , \((p_2 ,e)\)。对于任意满足$ 0 \leq t \leq 1\(的\)t\(值,投影平面上的插值点\)x\(值为\)p_3 = (1-t)p_1 + t p_2$ ,则通过原点与\(p_3,e\)的光线与线段的交叉点\((x_3,y_3)\)可以通过上面的公式获得:

\[ \frac{1}{z_3} =-\frac{p_3}{ec} + \frac{b}{c} \\ = -\frac{(1-t)p_1 + t p_2}{ec} + \frac{b}{c} \\ = (-\frac{p_3}{ec} + \frac{b}{c} )(1-t) +(-\frac{p_3}{ec} + \frac{b}{c} )t \\ = \frac{1}{z_1} (1-t) + \frac{1}{z_2} t \]
也就是说三角形表面上插值点的坐标值倒数是线性关系。二维屏幕上的插值点的可以通过\(\frac{1}{z}\)$ 计算获得

顶点属性插值

当对三角形进行光栅化时,三角形中任意一点的属性都是需要相邻顶点属性进行插值获得。假设线段两个端点的深度值\(z_1\) , \(z_2\) , 分别包含属性 \(b_1\)\(b_2\), 则插值属性\(b_3\)与插值点的关系:

\[\frac{b_3-b_1}{b_2-b_1} = \frac{z_3 - z_1}{z_2 - z_1}\]

\(z_3\)带入公式可以获得:

\[b_3 = \frac{b_1 z_2(1-t) + b_2 z_1 t} {z_2 (1-t) + z_1 t } \\ = z_3 [ \frac{b_1}{z_1} (1-t) + \frac{b_2}{z_2} t] \\ \\ \longrightarrow \frac{b_3}{z_3} = \frac{b_1}{z_1} (1-t) + \frac{b_2}{z_2} t \]
也就是说三角形属性插值与\(z\)倒数的乘积是线性插值。所以在光栅化的时候图形处理器先计算\(\frac{1}{z}\)的线性插值,然后再计算的顶点属性的插值结果

参考

[1] : 一篇关于投影校正的论文,下载地址:

[2]: (Mathematics.for.3D.Game.Programming.and.Computer.Graphics.3Ed) []
[3]: 博客文章
[4]: 关于光栅化的简单介绍

转载于:https://www.cnblogs.com/zsb517/p/6181663.html

你可能感兴趣的文章
【HDU 1402】A * B Problem Plus(FFT)
查看>>
windows 配置kerberos访问启用spnego的CDH 集群web UI页面
查看>>
快速排序
查看>>
【Atcoder】CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
查看>>
configServer的高可用
查看>>
Vue2.0 探索之路——生命周期和钩子函数的一些理解
查看>>
实验一 网络侦查与网络扫描
查看>>
数据结构学习笔记(3)_使用数组实现简单线性表功能
查看>>
微信小程序底部tabbar
查看>>
linux kernel map
查看>>
python利用opencv合成模糊图像
查看>>
dataframe splict
查看>>
hadoop环境搭建(linux单机版)
查看>>
nodejs 像 C 语言那样输出当前代码的行数
查看>>
luogo p3379 【模板】最近公共祖先(LCA)
查看>>
[考试]20150925
查看>>
12、K最近邻算法(KNN算法)
查看>>
如何使用crash分析vmcore - 之基础思路case1
查看>>
我所认知的电子商务解决方案
查看>>
关于float、double结果精度的问题
查看>>