opengl透视投影概念梳理

感谢原作者的分享,从基本概念娓娓道来,而且讲的通俗易懂,条例分明,以下是我按照自己习惯的理解方式进行了重新记录。

https://blog.csdn.net/popy007/article/details/1797121

1. 将目标物体投影到近裁剪平面上 (P >> P’)

我们一步一步来,我们先从一个方向考察投影关系。

上图是右手坐标系中顶点在相机空间中的情形。设P(x,z)是经过相机变换之后的点,视锥体由eye——眼睛位置,np——近裁剪平面,fp——远裁剪平面组成。N是眼睛到近裁剪平面的距离,F是眼睛到远裁剪平面的距离。投影面可以选择任何平行于近裁剪平面的平面,这里我们选择近裁剪平面作为投影平面。设P’(x’,z’)是投影之后的点,则有z’ = -N。通过相似三角形性质,我们得出如下关系:

同理,有

这样,我们便得到了P投影后的点P’

从上面可以看出,投影的结果z’始终等于-N,在投影面上。实际上,z’对于投影后的P’已经没有意义了(投影后已经成为了2D),这个信息点已经没用了。但对于3D图形管线来说,为了便于进行后面的片元操作,例如z缓冲消隐算法,有必要把投影之前的z保存下来,方便后面使用。因此,我们利用这个没用的信息点存储z,处理成:

这个形式最大化地使用了3个信息点,达到了最原始的投影变换的目的,但是它太直白了,有一点蛮干的意味,我感觉我们最终的结果不应该是它,你说呢?我们开始结合CVV进行思考,把它写得在数学上更优雅一致,更易于程序处理。假入能够把上面写成这个形式:

那么我们就可以非常方便的用矩阵以及齐次坐标理论来表达投影变换:

 由此实现了P到P’(近裁剪平面的投影),其中 -(az+b)/z 会在后面进一步解释。

2. 从平截头体(frustum)到规则观察体(Canonical View Volume, CVV)的线性变换 (P' >> P", 降低了裁剪难度)

在不规则的frustum中进行裁剪并非易事,所以经过图形学前辈们的精心分析,裁剪被安排到规则 CVV中进行,CVV是一个正方体,x, y, z的范围都是[-1,1],这样在多边形裁剪时就方便了许多。

 在此过程中,只对x和y分量进行线性差值变换,z和w分量不变,这样得到的P"即为映射到CVV空间的齐次坐标。通过线性差值变换保证了x,y方向上处于frustum中的点变化后一定会出现CVV中对应的位置([-1,1]区间内),为了在z方向实现同样的效果以及满足齐次坐标和矩阵运算的相关要求特别将z以 -(az+b)/z的形式构造出来。

在具体实现中,该过程是通过对输入齐次坐标P进行矩阵乘法后再进行透视除法达到的(MP/w=P"),由此从P"反推即可得到投影矩阵M。

由此推出:

3. 关键点总结

  1. 使用齐次坐标,可以将opengl的各种变换处理,借助当下图形硬件对齐次坐标和矩阵运算的支持来进行加速处理实现。
  2. 在具体实现中,P到CVV中P"的映射之所以分为透视投影(矩阵乘法,MP)与透视除法这两步,原因在于完成透视除法后,会损失一些必要的信息(如原始z,第4个-z保留的)从而使裁剪变得更加难以处理,因此分为两步,且在透视除法前完成裁剪工作。
  3. 经过透视投影(矩阵乘法,MP)后,原先图元已被投影到CVV空间的2D平面上,但是其坐标这时还是普通齐次坐标(w未必为1),再经过透视除法即可得到标准齐次坐标P"(w为1)。
  4. 经过透视投影与透视除法后得到的P"已为标准化坐标(投影与透视除法进行变换,裁剪除去了[-1,1]区间外的部分),那么倒退到裁剪阶段(透视除法之前)就可推知,[-w,w]即为x,y,z等3个方向上的裁剪标准,意即w发挥了裁剪模具的作用
  5. 目标物体从frustum中映射到CVV空间,必然发生了变形,但是可以在后续的视口变换(viewport transform)中通过指定视口纵横比w/h与frustum相同,从而实现等比例的恢复。也就是说出于裁剪方便而发成的变形会在视口中按比例恢复过来,不过z分量会通过线性差值映射到新的深度区间内[n,f](通常值为[0,1])。
  6. 原始点投影到投影平面发生了非线性变化,从投影平面到视口平面全是线性的;
  7. 后面光栅化时,求纹理坐标s,t时,是和1/Z成线性关系,要用1/Z插值求s,t坐标才正确。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值