【问题标题】:Best OpenGL culling method for old game rendering? [closed]旧游戏渲染的最佳 OpenGL 剔除方法? [关闭]
【发布时间】:2011-05-01 00:57:50
【问题描述】:

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

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

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

【问题讨论】:

  • 那是威力和魔法七吗? :)
  • 我现在只看了截图。让我告诉你:过去 5 年的 GPU 在渲染场景时无论有无剔除都不会出现问题。但是,我看到您的帧速率相当低。我猜你正在使用立即模式 (glBegin(...); for(v in vertices) glVertex(v) ; glEnd();),对吧?那么每个顶点就意味着一个函数调用,很有可能会切换上下文;这会导致 CPU 的主要负载拖累您的性能。如果还没有这样做,我强烈建议使用顶点数组,或者更好的顶点缓冲区对象。

标签: opengl 3d culling


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的精彩回答。真的很感激。
  • 我的印象是,为了使用 BSP 树,必须使用特定的数据结构对其进行设置。我有顶点和多边形。这足以构建 BSP 树吗?我当然会弄清楚这一切,只是想知道 BSP 方法是否是我应该利用我所拥有的信息追求的一种方法。谢谢!
  • @Satchmo Brown:是的,可以从该数据构建 BSP 树。每个平面多边形都定义为空间平面,将其一分为二。然后在每一半中,下一个多边形用于分割每一半,依此类推。维基百科有一篇好文章和优秀的外部链接en.wikipedia.org/wiki/Binary_space_partitioning
【解决方案2】:

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

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

看看glFrustum

【讨论】:

  • 我不确定。因为我实际上是在渲染每个区域中的每一个多边形,所以我无法判断哪些多边形实际上与渲染相关。
  • @Satchmo Brown:我说的只是平截头体上的 Z 远平面。如果你减少它与相机的距离,你就是在减少视锥体体积,这是场景中唯一将被渲染的部分。
  • 是否有内置的 opengl 方法可以做到这一点,或者我应该定制我自己的自定义截锥体类?再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多