您的位置:首页 > 产品设计 > UI/UE

Oblique View Frustum

2016-07-19 10:08 417 查看
http://blog.csdn.net/bugrunner/article/details/7784581

前些时间有做过动态水面反、折射的实现,这之中需要在水面上下不同位置设置摄像机并使用水面为裁剪平面来生成折射或反射下的场景纹理。这里边可以直接使用D3D提供的裁剪平面方法来实现或是用自定义的Shader的方法来实现。此外还有一种方法就是直接修改投影矩阵来将原始的近平面修改成某个指定的平面来实现,这样其实就相当于构造并得到了一个不规则的视锥体(Oblique View Frustum);抛开这种方法的适用性不说,至少其中涉及的关于投影矩阵与视锥体间关系的各种推导还是很有启发意义的,因此这里简单总结一下。


1. 变换矩阵与视锥平面的基本关系


对于空间上的点来说将其由视图空间变换到裁剪空间可直接由投影矩阵变换来完成:



而对于空间向量和平面而言将其由视图空间向裁剪空间的变换需要借助于投影矩阵的逆的转置来完成:



其中的下标c , v 用来标识所处于的空间系统,如c 为Cilp-space,v为View-sapce。对于大多数可逆的投影矩阵而言其均具有这样的特性:



因而上式可以转化为:



使用上式并结合视锥体在投影空间下的各个裁剪平面的方程就可以得到这些裁剪平面在视图空间下的方程表示,对应关系如下(将上式中的

转化为原始M:



上述列式也给出了从投影矩阵中获取视图空间中视锥体六个约束平面方程的方法,其中的Mci分别表示投影矩阵M的第i 列。当然,如果想得到视锥平面在其它空间内的方程可以用同样推理方法:比如使用ViewProjection Matrix代替Projection Matrix来获得这些平面World
Space中的方程。

接下来就可以使用上述的基本关系来推导不规则的视锥投影矩阵。

2. 关于斜远近平面的演算

在视图空间中,将一个视锥体中的近平面表示为

(对于其上的一点



),而其对就应的投影矩阵中的元素表示为N
= Mc3,此时如果需要改变近剪平面时则需要修改与之对应的投影矩阵分量Mc3。假设修改后的新的近平面为

,相应的远平面也会被投影矩阵元素的改变而影响到



如果没有其它更多的条件则对远近平面的修改无从下手,不过这里可以从下述两个方面远近平面的修改进行约束:
修改后的远近平面之间的夹角要尽可能地小,这样才能保证最后在投影平面上各区域得到的Z值比例尽可能地相同(原始的远近裁剪平面之间相互平行,因而最后投影得到的Z 值也会均匀,而修改后的远近平面之间不再平行因而得到的尝试值也就不再均匀,因而为了Z值的考虑需要这样的约束)
修改后的远平面需要包含原始视锥远平面上的点。斜视锥主要是用来完成近平面上的不规则裁剪,因而就要尽量避免对原始视锥中的物体做不正确的剔除,所以要求远平面尽可能地包含原始视锥。

上述约束条件的满足同样涉及到对远、近平面F'=Mc4-C'进行合理位置与方向的调整,其中主要有三个因子Mc3, Mc4, C';其中的Mc4 并不能直接被改动,因为其中包含相应的元素在投影变换后做归一化操作;对于平面C',所有的修改并不能影响到其原始的平面属性而只能是其数值上的改动,这样对C'的修改也就被限制为添加并调整一个缩放因子

;对于Mc3的改动则较为自由。这样一来可以将修改后的近平面N'表示为

,而其与Mc3间的关系则变为

。此时F'的最终表示就是:



这样得到的最终约束就是将修改后的远平面刚刚包含原始视锥体的远平面上的几个点,且距离修改后的近平面最远的一个视锥上的点Q必定处于远平面上(在裁剪空间和视图空间中均满足这些特性)。若修改后的远近平面分别为N', F',与N'对应的视锥体上的最远点为Qv,则此时有

。点Qv在裁剪空间下对应的点为Qc =
Qv M,Qc又可以根据裁剪空间中近平面的方向在Z轴方向上的偏移来确定,其可以表示为:



整理上述F', Qc, Qv间的关系可得:





这样就可以得到对应的投影矩阵中被修改的部分Mc3新的表述为:




且有:



3. 斜视锥对Z值的影响

由上可知对于自定义的不规则裁剪视锥的修改可以通过关于M'c3的表达式来实现。在D3D中的投影矩阵与远近平面的关系如下式所示:



而其对应的逆矩阵为:



由于其中

,因而简化后的M'c3可以表示为:





同时又可以得到简单化的Qv 表达式为:





进而:





这里可以用原始的视图空间中的近平面方程来验证一下上述变换公式,

,将其代入上式中可得



此时将其代入同样得到了原始的投影矩阵。不过最后需要分析一下这些操作得到的投影矩阵最后的变换对于Z值的影响:由于在不规则的裁剪视锥中会得到不平行的两个远近平面,因而这时在视线的不同方向上就会得到不同分辨率的Z值(不平得程度越大,Z 值
的不均匀程度越大,算法的效果越差),这样的话对于一些基于Z 值的渲染操作可能会产生不良的影响(比如SSAO等需要使用Z值做为伪空间信息来进行遮挡计算的算法,不同分辨率的Z值会对应出不同的视觉效果)。远近平面之间的夹角(即不平行程度)决定着Z值的均匀度也即这种方法的优劣,而远近平面之间的夹角又受到两个文面的影响:

修改后的近平面的法向偏离视线方向的程度,偏转越大远近平面越不平行

原始远平面距离视点的距离,距离越大不平行程度越大

因而上述这些限制可能就限制了这种方法的使用范围。

更多的内容可以参考一下这篇论文:Oblique
View Frustum depth projection and Clipping
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: