3D游戏场景中的可视性处理
BSP树存在明显的缺点,如果要处理的是一个“有门”的场景,观察者还可以透过门或者窗看到其它房间的物体,而看到得可能只有其它房间很少的物体,这样如果对每个房间都创建单一的BSP树的话就是很低效的。在这种情况下可以使用Portal技术,常对于一个室内场景来说它可以被描述为由一个个“洞口”相互连接的“房间”组成,这里“洞口”被称为portal而“房间’,被称为sector,通常sector被定义为一个“凸”的“闭合”的多边形集合。portal引擎的基本方法是当通过一个指定观察位置的视见约束体(view frustum)进行渲染时,如果一个portal出现在可视范围内,那么portal将对视见约束体进行剪切,这样与其相连的sector将会通过一个观察位置相同但己经改变过的视见约束体进行渲染。这是一个非常简单而且非常适合进行递归调用的方法,由于视见约束体被portal进行了精确的限制,因此被隐藏的物体可以很简单进行剔除。
一个portal引擎虽然能够提供许多非常好的特性,但是它的结构太复杂。当你使用portal技术来构建一个渲染系统时存在问题,最大的一个问题是在渲染场景的每一帧都需要进行可视性检测,这会产生大量的多边形剪切操作,在场景非常复杂的情况下,运算的代价会非常的高,因此需要寻找一种技术来对场景中可视性检测进行预计算而不是在运行期间进行计算。PVS (PotentiallyVisible Set)可视性集合,就是为了解决这个问题而出现的一项技术,可以通过对BSP中每一个叶节点设置一个PVS,这个PVS保存了从第一个叶节点开始看到的叶节点集合,它不仅可以用来帮助加速场景渲染,还可以用来加速场景中光照运算和进行网络优化。PVS是在场景进行预渲染时计算出来的,每一个BSP的叶节点都保存一个可视节点的集合,当对场景进行渲染时,摄象机所在的叶节点将被渲染,同时保持在PVS中的叶节点也将会被渲染出来,这里需要一些算法来避免场景重复渲染,由于今天硬件加速卡的发展,它所提供的硬件Z缓冲的大小己经可以方便的解决这个问题。