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

本文共 1629 字,大约阅读时间需要 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]: 关于光栅化的简单介绍

转载地址:http://axifa.baihongyu.com/

你可能感兴趣的文章
使用Vitamio打造自己的Android万能播放器(1)——准备
查看>>
cmd 命令
查看>>
C# 获取调用方信息
查看>>
成都区域赛总结
查看>>
Exception.InnerException 属性的使用
查看>>
Android 第一个OpenGL ES程序
查看>>
Android 游戏开发 View框架
查看>>
自定义菜单用例
查看>>
获取request中的查询参数
查看>>
POJ 3026 Borg Maze
查看>>
判断IP地址是否合法类
查看>>
linux 常用命令
查看>>
python 中的input
查看>>
Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance 模拟
查看>>
SSL延迟有多大 (Https)
查看>>
const constexpr C++ 解释
查看>>
zookeeper leader选举机制
查看>>
Java 反射机制[Field反射]
查看>>
深入理解Delete(JavaScript)
查看>>
JS 借助 pako.js 实现网络请求获取 gzip 数据流并解析, 解决汉字乱码
查看>>