2

我正在从旧游戏中渲染一些旧几何图形。他们的客户有一些算法可以让他们查看附近的区域,但我没有这种能力,所以我正在研究剔除不必要的多边形。目前,我正在渲染整个区域中的每个多边形,无论我是否可以看到它,无论它是否在可视范围内。显然,这是完全低效的。

我应该考虑使用哪种类型的剔除?

我知道我可以剔除不在截锥体中的多边形,这将有助于减轻一些负载,但我可以说,选择不渲染距相机一定距离的多边形吗?这个叫什么?我也在某些区域使用雾。同样的问题。我能想出一种方法来剔除雾后面的所有东西,我看不到的区域。

4

2 回答 2

6

有两件不同的事情需要考虑:您只是想正确地查看它,即去除隐藏的表面吗?然后简单的深度测试就可以了;开销是,您处理的几何图形根本不会出现在屏幕上。但是,如果这是一个(非常)古老的游戏,您从中获取数据,则很可能带有所有资产的完​​整地图的多边形数量少于现代游戏中全屏显示的多边形数量。在这种情况下,您将不会遇到任何性能问题。

如果你真的遇到性能问题,你需要在你想要花费多少时间、确定什么(不)可见以及实际渲染它之间找到一个平衡点。10 年前,几乎像素完美以节省尽可能多的光栅化时间仍然至关重要。现代 GPU 拥有如此多的备用功能,只需粗略选择要包含在渲染中的内容就足够了。

然而,这些计算完全超出了 OpenGL 或任何其他 3D 光栅化 API(例如 Direct3D)的范围——它们的任务只是使用复杂的光栅化方法在屏幕上绘制三角形;没有对象管理,没有更高级别的功能。所以这取决于你来实现它。

典型的方法是使用空间细分结构。最受欢迎的是Kd 树八叉树和BSP 树。BSP 树在空间上非常有效,但计算量更大。我个人更喜欢 Kd 树和八叉树的混合/组合,因为它们很容易修改以跟随场景中的动态变化。BSP 树的更新要重得多(通常需要完全重新计算)。

鉴于这样的空间结构,很容易确定一个点是否位于特定的感兴趣区域。通过几何约束(如平面)选择树中的节点也非常简单。这使得实现粗截锥体剔除变得非常容易:使用截锥体裁剪平面从平面内的树中选择所有节点。为了使 GPU 的生活更轻松,您可能希望对节点进行排序,从近到远;树结构再次帮助您,因为您可以递归地对树进行排序,从而产生几乎最佳的 O(n log(n)) 复杂度。

如果您仍需要提高渲染性能,您可以使用树定义的空间划分,在occlusion query中(不可见地)渲染测试几何,然后递归到受测试边界限制的子树。

于 2011-05-01T09:16:04.887 回答
1

我知道我可以剔除不在截锥体中的多边形,这将有助于减轻一些负载,但我可以说,选择不渲染距相机一定距离的多边形吗?这个叫什么?

这已经由它自己的截锥体完成了。远平面为要渲染的对象设置相机距离限制。

看看glFrustum

于 2011-05-01T01:03:48.250 回答