大规模场景消隐

1、相关工作



目前常见的大规模场景消隐主要有视域消隐,背面消隐,遮挡消隐,以及部分预处理消隐等,可分为世界空间消隐和投影空间消隐。最早提出消隐的是Clark。1976年,他提出了层次化的树状结构,指出当物体仅覆盖屏幕较小区域时, 可以用该物体描述较粗的模型进行绘制,利用递归方法去除了不可见的节点。在世界空间消隐中的视锥剔除方面,1997年,Salter和Chrysanthou提出了probabilistic caching scheme方法,将视锥(VV)判断的结果分为OIB三类(完全不可见、完全可见、相交)分别处理,提出了一套完整的视锥剔除方法,使渲染速度得到明显的提高。1999年和2001年,Ulf Assarson和Tomas Moller对视锥剔除的有关方法进行了探讨,详细地对比和介绍了AABBs和OBBs两种测试法。下表简单归纳了常见的消隐方法:




表1 各种消隐方法



2、基于视锥平面方程的节点视锥剔除



视锥体(frustum),是指场景中摄像机的可见的一个锥体范围。它有上、下、左、右、近、远,共6个面组成。在视锥体内的景物可见,反之则不可见。根据需要,只对其中与视锥体有交集的节点进行细分。



图 1. 节点视锥剔除


视锥剔除的目标可以简单归结为:对于给定的一个树节点和一个视锥体,判定该节点是否在视锥体内。如果在,则继续细分和渲染;如果不在,则剔除该节点。



过去常见的视锥剔除方法比较多的是基于计算几何,与Direct3D,OpenGL等API无关的方法。根据视锥近似的形状主要可以归纳为以下几类:



第一类是直接计算视锥的投影三角形,与待判断的二叉树或者四叉树进行求交运算,如李惠等提及的视锥投影三角形法,此方法适合没有高山,开阔的平原地形,能够一定程度降低运算量,这种方法粗略地把视锥与节点的求交近似为三角形与另一平面闭合多边形的求交



第二类是对节点的空间半平面与视锥近似的棱锥进行求交运算,如可以计算出棱锥的各个顶点与半平面的点积,如果各个点积结果都具有相同的正负符号,则说明视锥的各顶点位于平面的同一侧,不相交。这种方法只使用了节点的空间半平面,同样并不能精确地筛选出需要剔除的节点。



第三类是把视锥近似看成一个最小外接球与空间四叉树的最小外接球求交。这种算法在速度上有着明显的优势,只需要比较外接球的球心距与两球半径和的大小,相对前两类方法都要快,但是同样缺乏精确度。



上述这些算法在剔除计算速度上各有优势,在一定程度上剔除了大量的不可见三角形,但也存在缺陷。如一些方法剔除了过多的三角形,丢失了部分可见集,特别是距离摄像机近的小的三角形面,而另一些剔除却远小于保守可见集,这些方法在降低剔除判断难度的同时增加了图形流水线渲染的节点量,相比而言,渲染一个节点的时间远长于精确剔除判断的时间。因此,我们需要寻找一种能够结合Direct3D/
OpenGL能够兼顾速度和精确度的剔除方法,通过Direct3D / OpenGL等图形接口充分利用GPU。



本文探讨了求视锥平面方程系数,针对Direct3D/OpenGL,能够联合世界矩阵、观察矩阵、投影矩阵的快速的视锥剔除方法。主要步骤如下:



<1>、求视锥平面系数

首先,把视锥体变换为长方体状的裁剪空间。如图2,左图为世界空间中的视锥体。右图为经过变换后的裁剪体。




图2. 视锥变换示意图

设变换前六个平面中某个面上一点



其中




由此可见,对于刚好处在视锥左表面的平面应满足下面世界空间下的平面方程:



得:

A = M14 + M11

B = M24 + M21

C = M34 + M31

D = M44 + M41



对于OpenGL,所得的投影矩阵与Direct3D中的行列转置,所以V'=MV。



同理,可以推得各个平面方程系数,如表:



表3 视锥平面方程系数



假设W=1,考虑到平面法向量 常以单位向量表示,我们把平面方程单位化:



因为所有的平面都是面向视锥的,所以当Distance>0时,我们认为点在平面的前方;当Distance<0时,我们认为点在平面的后方;当Distance=0时,我们认为点在平面上,在没有特殊情况时,我们把它归为可见,即认为点在平面的前面。





<3>、判断节点是否在视锥内



通过各种包围体方法(各种传统的包围体方法及本文探讨的Bounding Mesh方法将在2.2详细探讨),求出近似包围体,对包围体上的各个点根据<2>对视锥六个面作判断,存在以下三种情况:



l 如果所有顶点都在视锥范围内,则待判区域一定在视锥范围内;

l 如果只有部分顶点在视锥范围内,则待判区域与视锥体相交,我们同样视为可见;

l 如果所有顶点都不在视锥范围内,那么待判区域很可能不可见了,但有一种情况例外,就是视锥体在长方体以内,这种情况我们要加以区分。



3 Bounding Mesh遮挡剔除

3.1 Bounding Mesh



传统的包围体常见的有Bounding Sphere和Bounding Box。两种方法都是通过判断待判区域与视锥体的位置关系来确定区域是否可见

l Bounding Sphere将待判区域近似成一个球体,比较球心到视锥各个平面的距离,从而得知待判区域的相对位置。这种算法只需对半径和距离进行比较,判定速度较快。

l Bounding Box将待判区域近似为长方体,对8个顶点逐一与视锥求交,判断顶点是否在视锥内。这种方法需要较多的判断次数,但更为精确,能更快的提高渲染速度。

l 对Bounding Sphere和Bounding Box加以优化,先进行Bounding Sphere判断,通过Bounding Sphere判断的节点再进行Bounding Box判断能够更进一步提高速度。



然而这些近似包围盒都不是最理想的,Direct3D9.0新提供的Bounding Mesh方法使我们能更充分利用GPU。Bounding Mesh不但比Bounding Sphere和Bounding Box更精确,而且速度快了相当多。



图3. 各种类型的包围体



上图展示了多种类型的包围体,包括Bounding Box、Bounding Sphere和Bounding Mesh。相比之下,Bouding Mesh有两个优势:第一,从图例中可以看出, Bounding Mesh在体积的接近程度上,包围网格的体积上和原始网格的体积是最接近的。这避免了大量的顶点被错误地渲染或剔除掉,最能得到更为精确的保守可见集。第二,Bounding Mesh与Bounding Box或者Bounding Sphere不同,不是由我们通过某种计算几何方法产生的,它在构造Mesh时由Direct3D实时通过点扩张探测构造的。



E1 各种包围体方法对比实验



我们就这四种包围方法体的剔除效果进行了比较实验,实验进行时地形场景摄像机处于地面上空视线方向与水平面约成30度角,观察范围约在两个1024×1024 Grid块之内,节点采用哈希表标记节点状态。收集数据时摄像机位置和视锥范围不改变,只改变剔除方法,不使用LOD方法,剔除前总节点量为:



可见,Bounding Sphere能够快速剔除80%以上不在视锥范围内的节点,大大减小需要渲染的节点数量;Bounding Box比较精确地剔除了90%以上不在视锥范围内的节点,比Bounding Sphere渲染了更少的三角形,但Bounding Box需要较大的运算量,在数据量大时速度下降得较快。而第三种剔除方法是对通过Bounding Sphere测试的节点再进行Bounding Box测试,这样83%的点在进行Bounding Sphere测试阶段被剔除,还有10%的节点在进行Bounding Box测试时被剔除,这样能结合两种剔除方法的优势。Bounding Mesh利用Direct3D9构建更加逼近原始Mesh的Bounding Mesh,剔除了93%的三角形,同时由于其Bounding Mesh由Direct3D图形接口求得,最大限度地利用了GPU,降低了运算量,具有更好的剔除效果。



3.2 IDirect3DQuery9下的遮挡剔除



在图像空间坐标系下进行剔除,关键是在对象渲染过程剔除被前面物体遮挡住的对象。遮挡剔除在大规模地形场景策略中有着非常重要的地位,特别是对于起伏的地形,常常会存在着面向摄像机视向的遮挡关系。下图显示了遮挡例子,可以想象面向摄像机前面浅灰色的为高的山脉,后面深灰色的为矮的山脉,显然后面的被前面的遮挡了。



图4. 遮挡剔除



IDirect3DQuery9 接口是Directx9的一个新特性。它允许访问大量的统计数据,包括优化信息、资源管理器的对象以及三角形信息。



IDirect3DQuery9 进行遮挡查询时,它将计算在屏幕上可见的象素数目。只有在请求开始和请求结束之间渲染的象素才会被计算在内。如果计算的结果为0,那么说明物体的所有顶点都被遮住了,。另外,如果计算的结果是大于0的,那么物体是可见的。



整个遮挡剔除可以分为两步:



第一步中,每一个对象的Bounding Mesh先计算一次以确保Z-buffer中有整个场景的深度信息。因为如果遮挡查询在整个场景的深度信息加入Z-buffer之前就开始了,那么由于深度顺序未确定,可能使被要求询问的物体可能也会被错误地认为是可见的。



第二步,现在所有物体的包围网格深度数据已经在Z-buffer中了,询问每一个节点是否被遮盖了,如果查询结果发现节点不在屏幕范围或者待渲染位置已经有对象遮挡了,这个对象最终将不会被渲染。否则,如果有一个或多个可见的屏幕投影象素点,那这个对象就会被加入到渲染队列中。



此外,为了加快剔除速度,我们这里不在屏幕大小的主缓冲进行。用一个小一些的缓冲(320 X 240)里进行粗略的遮挡剔除,以加快速度。



参考文献



1. IEEE Transactions on Visualization and Computer Graphics, 1998 4(1), 21-36, “Efficient Collision Detection Using Bounding Volume Hierarchies of k-DOP” J.T. Klosowski & M. Held & J.S.B. Mitchell & H. Sowizral & K.Zikan

2. Proceedings of the ACM Symposium on Virtual Reality Software and Technology 1997 71-78 “View Volume Culling Using a Probabilistic Caching Scheme” Mel Slater & Yiorgos Chrysanthou

3. Proceedings of ACM SIGGRAPH 2001 149-158 “A user-programmable vertex engine” Lindholm et

4. Graphics Tools, 2000 5(1), 9-22, “Optimized View Frustum Culling Algorithms for Bounding Boxes” Ulf Assarson & Tomas Moller

你可能感兴趣的:(Scheme,caching,transactions,Direct3D,distance,Visualization)