用于旧游戏渲染的最佳OpenGL剔除方法?

时间:2011-05-01 00:57:50

标签: opengl 3d rendering culling

嘿伙计们,我正在渲染旧游戏中的旧几何体。他们的客户有一些算法,让他们可以看到附近的哪些区域,但我没有这种能力所以我正在考虑剔除不必要的多边形。目前,我正在渲染整个区域中的每个多边形,无论我是否能够看到它,无论它是否在视觉范围内。显然这是完全没有效率的。我的问题:

我应该使用什么类型的剔除。我知道我可以剔除不在平截头体中的多边形,这将有助于减轻一些负荷,但我可以说,选择不渲染距离相机一定距离的多边形吗?这个叫什么?我也在一些地区使用雾。同样的问题。我可以想出一种方法,我可以剔除雾后面的一切,我看不到的区域。

谢谢:这项工作的截图正在进行中。有些人可能会认出来:) 另外,忽略叶子的丑陋颜色。我没有考虑到阿尔法蒙版。

图片:http://i.stack.imgur.com/duc2I.png

2 个答案:

答案 0 :(得分:6)

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

如果你真的遇到性能问题,你需要找出你想花多少时间,确定(不)可见的,以及实际呈现它的平衡。 10年前,保持尽可能多的光栅化时间几乎完全像素仍然是至关重要的。现代GPU具有如此多的备用功率,只需粗略选择要包含在渲染中的内容即可。

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

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

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

如果仍需要提高渲染性能,可以使用树定义的空间划分,在遮挡查询中(无形地)渲染测试几何体,然后再递归到受限制的子树中。测试范围。

答案 1 :(得分:1)

  

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

这已经由它自己做到了。远平面为要渲染的对象设置摄像机距离限制。

查看glFrustum