游戏开发论坛

 找回密码
 立即注册
搜索
查看: 13805|回复: 8

一种高效的基于大规模地形场景的OCCLUSION CULLING算法

[复制链接]

33

主题

118

帖子

173

积分

注册会员

Rank: 2

积分
173
发表于 2007-3-26 16:37:00 | 显示全部楼层 |阅读模式
  对于通用场景来说我以前介绍的区间扫描线Z缓冲器算法可以剔除大部分的不可见物体,但是在基于heightmap的大规模地形场景下会发现作用不是太大,区间扫描线Z缓冲器算法需要在场景中手工指定occluder,occluder必须为规则物体,而在地形场景中这种occluder非常少,也就是场景中的建筑物之类的物体。实际上地形场景中最适合作为occluder的是连绵起伏的丘陵、山脉,它遮挡住了场景中的大部分物体,但是区间扫描线Z缓冲器算法对这种情况下的OC就无能为力了,需要使用其它算法进行OC计算,现在网上完全公开的适用于地形场景的OC技术主要有以下几种:

Voxel column culling、Hierarchical visibility、incremental horizon。这些算法都需要进行一些预处理,其中最流行是incremental horizon(增量地平线)技术,这种技术要求在渲染前对每一个地形块计算一个潜在轮廓线,在渲染时将这些潜在轮廓线合并为地平线进行OC处理。由于这种算法需要进行预处理因此也不太适用游戏开发,此后我自己又开发了一个realtime计算的incremental horizon算法,但是发现开销太大,根本无法用于realtime rendering(和Pascal Junod在论文《Implementation of a O(na(n)log(n)) Point Visibility Algorithm on Digital Terrain Models》中使用的算法相同,这篇论文我也是后来才发现的,有兴趣的可以翻看一下我以前在gameres发表的文章)。

下面列出的是网上相关的论文,有兴趣可以自己看一下。

Lloyd B, Egbert P. Horizon occlusion culling for real-time rendering of hierarchical terrains. In: Gross M, Joy KI, Moorhead RJ, eds. Proc. of the IEEE Visualization. Boston: IEEE Computer Society Press, 2002. 403-410.
Stewart J. Hierarchical visibility in terrains. In: Dorsey J, Slusallek P, eds. Eurographics Workshop on Rendering. Vienna: Springer-Verlag, 1997. 217-228.

Zaugg B, Egbert P. Voxel column culling: Occlusion culling for large terrain models. In: Ebert D, Favre JM, Peikert R, eds. Proc. of the Joint Eurographics-IEEE TCVG Symp. on Visualization. Vienna: Springer-Verlag, 2001. 85-93.Stewart J. Fast horizon computation at all points of a terrain with visibility and shading application. IEEE Trans. on Visualization and Computer Graphics, 1998,4(1):82-93.

Daniel Archambault. All the Distant Horizon Edges of a Terrain. B.Sc. (Hons.) in Computing Science, Queen’s University (Kingston), 2001 Pascal Junod. Implementation of a O(na(n)log(n)) Point Visibility Algorithm on Digital Terrain Models. October 1999

  后来我仔细观察farcry的editor sandbox,经过差不多两个多月的试验终于开发出一个可以realtime运行的用于地形环境的OC算法,这个算法的开销非常小,经过我在OGRE平台上的试验,此算法可以做到非常精确的剔除,FPS提升明显。由于这个算法的核心是线段求交,因此我暂时称其为线段求交OC算法。

在介绍这个算法前先明确一下坐标系,一张heightmap的行为X,列为Y,高度方向为Z。
先考虑单点OC的情况,如下图所示:
         P
         |
         |C
A-------------------B
         |
         |
         O
假设plane AB为一个occluder,O为camera位置,如果要判断点P是否被AB遮挡,只需要简单的判断线段OP是否和occluder AB相交即可,如果存在相交点C则点P即被遮挡,问题被简化为线段和平面的求交。下面继续考虑在地形环境下如何简化这个问题,在地形环境下heightmap的每一行和列都可以看作一个occluder,这里假设AB为行或列相临两个顶点组成的线段,如果要判断点P是否被AB遮挡,可以通过比较交点C在线段OP和线段AB上的z值来确定:

Zc_op > Zc_ab   点P没有被线段AB遮挡

Zc_op <= Zc_ab  点P被线段AB遮挡

现在检查点P是否被遮挡在地形环境下简化为一个简单的2D线段求交问题,这也是本算法之所以高效的原因。

下面继续来看一下如何将算法由一个点推广到整个地形。在基于heightmap的地形系统中通常将地形分成一块块小的tile,根据LOD算法的不同tile大小可以为17*17或者33*33不等,这里假设使用17*17的tile。

首先来看如何剔除场景中被遮挡的tile。对于tile来说如果所有的顶点都位于其前方行和列的下方,那么它一定被遮挡。换句更精确的定义,对于tile的每一个顶点,如果与camera所在位置所形成的线段,全部与位于tile和camera之间的行或列中任意一条线段相交,那么可以确认tile被完全遮挡。

按照上面的定义,一个tile如果被检查到完全遮挡需要检查17*17=289次,虽然2D线段求交运算开销非常小,但是一个tile就需要进行289次运算仍然是不可接受的,需要更简化的算法。考虑一下区间扫描线Z缓冲器算法,occludee使用都是物体的AABB,是否可以使用tile的AABB进行运算呢?由于地形环境的性质可以不用考虑AABB最下面的四个顶点,但是直接使用AABB最上面的四个顶点进行运算绝对不行,如图所示:



四个顶点虽然被完全遮挡,但是occludee并没有被完全遮挡,如果解决这个问题需

要将AABB的up表面分割成16*16的格子,这样的话运算次数并没有发生变化。
这里可以使用一个取巧的方法,如下图所示:


将AABB投影到camera空间,直接获得线段AB,将AB线段16等分,获得17个新的顶点,注意这些顶点z值全部相等,现在ocludee是否可见只需要检查17次就可以了。

下面看一下算法复杂度,对于一个完全遮挡的tile只需要进行17个顶点的计算,完全未遮挡的tile只需要计算一个顶点,部分遮挡的tile大约是2-16个顶点左右,由于tile在进行OC运算之前首先要做frustum culling,剔除被frustum culling的tile,然后剔除那些没有被遮挡的tile,实际上的运算量非常少。

注意这里的每个顶点的计算不是指简单的17次线段求教运算,根据tile距离camera位置的远近每一个顶点求交的数量是不一样的,例如下图所示:


图中线段OA需要检查三条行和列,一共是六个交点,需要进行六次线段求交运算.

对于场景中的模型进行OC运算时,也需要按照上面的方法将模型的AABB变换到camera空间,获取一条occludee线段,然后根据地形相临顶点之间的距离确定顶点数。

使用这个算法和区间扫描线Z缓冲器算法相配合可以获得在室外场景中最大限度的剔除被遮挡物体,先用线段相交OC算法剔除被地表遮挡的tile和模型,然后用区间扫描线Z缓冲器算法剔除被建筑物遮挡的tile和模型,完美的室外场景OC解决方案,very nice!!!!

原创文章,转载请注明出处!!!!!!!

线段相交OC算法演示程序下载(使用OGRE平台,运行前先看readme文件):

http://www.cnblogs.com/dreams/archive/2007/03/26/688650.html
这是我的新blog,呵呵.

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2007-3-26 17:05:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

顶。

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-3-26 17:14:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

收藏~

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2007-3-27 09:30:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

顶起来!!!

8

主题

111

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2007-3-27 09:32:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

“如果要判断点P是否被AB遮挡,可以通过比较交点

C在线段OP和线段AB上的z值来确定:
Zc_op > Zc_ab   点P没有被线段AB遮挡
Zc_op <= Zc_ab  点P被线段AB遮挡"

这句话没看明白,OP和AB不一定有交点啊,还有什么叫C在OP和AB上的z值啊,是说投影吗?

0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2007-3-27 09:57:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

收藏~

33

主题

118

帖子

173

积分

注册会员

Rank: 2

积分
173
 楼主| 发表于 2007-3-27 11:22:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

回复ixnehc:
OP和AB在2D方向(x,y平面)上一定有交点,然后通过交点坐标(x,y)获得相应的z即可.

10

主题

219

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2007-3-28 08:25:00 | 显示全部楼层

Re: 一种高效的基于大规模地形场景的OCCLUSION CULLING算法

想法不错,赞!我考虑过和你一样的方法,不过仅仅是基于包围盒,所以剔除有错误
运行了下demo,不过性能似乎不升反降哪
渲染剔除部分的时间可能还小于计算遮挡裁减的时间
寻找瓶颈很关键哪

3

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2007-5-20 02:51:00 | 显示全部楼层

Re:一种高效的基于大规模地形场景的OCCLUSION CULLING算法

我按照您说的实现了这个算法。。。。。。。。
“将AABB投影到camera空间,直接获得线段AB”这里碰到了些问题,我获得的线段AB似乎有些不正确,我是这么做的:
把AABB上平面的四个顶点用View矩阵变换到View空间里,然后在View空间里记录这四个顶点的minX maxX maxY maxZ,这样就获得了View空间里的AB,vecA(minX,maxY,maxZ) vecB(maxX,maxY,maxZ)再用View的逆矩阵将vecA,vecB变换回世界空间。
但是我这么获得的AB好象有错误,有时会超出terrain的范围,导致无法读取该位置的高度。后来我把AB超出terrain范围的情况忽略掉了,直接返回此tile可见,但还是发现OC的结果有错误,有些不该剔除的tile被剔除了。
dreams是怎么获得AB的呢???请指点指点。

顺便说下个人用后感想是这个算法的速度真的是并不快。。。。。。。
远处的tile的运算量太大了,不像地平线,每个tile都要重新从camera开始一点一点算过去。
所以就改成lod级别比较低的,也就是离camera比较远的tile不进行oc运算,直接画出来还快点。
还有就是线段求交运算,虽然并不是多慢但是求交的次数太多了,而且求交的乘法也不少,所以也改了,以最后一张图为例,需要进行3行3列,6次的求交。我没有用求交,直接用世界空间里的OA,根据高度图空间里OA的长度length对其进行length等分,然后再用那些分点的高度与高度图的高度比较。但是这样可能会错过些极值点,所以比较的时候给分点的高度加上了一个指定的值,就是terrain中相临两点的高度差的最大值。
但是速度还是不够快。。。。。。。感觉跑513x513还行,1025x1025就明显的慢了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 10:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表