3D游戏场景中的可视性处理

时间:2008-11-23   来源:   网友评论:0   人气: 157 作者:

不渲染场景中不可见的面可以大幅度地提高渲染速度,特别是在大规模的场景当中。就是在硬件加速技术飞跃发展的今天,虽然现在已经可以完成许多在过去被认为是不可能实现的工作,但是对于隐藏面进行剔除仍是加速图形渲染的一项重要技术。通常当一个游戏运行的时候,它最少需要以每秒30帧的速度运行,在几年前这使得如果每一帧渲染的带纹理的多边形数量超过5000个就会被认为是不可接受的,而现在几乎所有的商业显卡每一秒都可以渲染几千万个多边形。但是现在仍然需要使用隐藏面剔除这项技术,因为对于不可见物体渲染以后将会被可见物体遮挡住,这样做无谓地浪费了显卡的带宽,尽管同时它也增加了场景的细节,使游戏画面看起来更加吸引人。现在的问题是多大程度上来剔除隐藏的多边形,象VFC (view frustum culling)portal渲染这样的技术来剔除一个不可见多边形是非常耗费时间的,用来去做这些计算的CPU时间可以用来完成其它诸如Al或碰撞检测这样的工作,因此开发一个隐藏面剔除算法必须注意到这一点。对于现在的游戏来说几乎没有一个是将每一个隐藏的多边形都进行剔除,而是剔除一个多边形的集合如一个节点或一个物体等等。对于一个单独的多边形它并不进行剔除,因此一个正确的隐藏面剔除方案是允许一定的重复渲染来适当的减少计算量。因此,可以采用一个混合的方案,如果一个叶结点包含多边形的集群,而不是单一的面,那就可以先用BSP树快速地消除视见约束体之外的物体,而视见约束体内的物体的可以性可以由硬件Z缓冲方法来实现。

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缓冲的大小己经可以方便的解决这个问题。

相关文章

文章评论