3

我正在尝试使用 openGL 制作游戏或 3D 应用程序。游戏/程序将包含许多对象并绘制到屏幕上(大约 7000 个)。当我渲染它们时,我需要计算相机和物体之间的距离并对它们进行排序,以便正确渲染场景中的物体。知道了这一点,对它们进行排序的最佳方法是什么?我真的希望排序能够非常快地完成,但我听说它们需要“权衡”,那么我应该使用什么算法来获得最佳性能呢?

任何帮助将不胜感激。

编辑:很多人都在谈论 z-buffer/depth 缓冲区。这在某些情况下不起作用,就像一些人谈到的那样。这就是我问这个问题的原因。

4

2 回答 2

9

按距离排序并不能完美解决透明度问题。考虑两个透明表面相交并且每个表面都有一个离您更近的部分的情况。也许在游戏中很少见,但如果您不希望渲染器偶尔出现故障外观,仍然需要考虑。

更好的解决方案是与订单无关的透明度。借助支持原子操作的最新图形硬件,您可以使用 A 缓冲区以很少的内存开销和单次通过来执行此操作,因此非常高效。例如见这篇文章

尽管如此,对场景进行排序的问题仍然是一个有效的问题,即使它不是为了透明——将不透明的对象从前到后排序以允许深度测试丢弃看不见的片段仍然很有用。为此,Vaughn 提供了 BSP 树的出色解决方案——只要 3D 游戏出现,这些树就一直用于此目的。

于 2013-04-06T16:29:02.040 回答
1

使用http://en.wikipedia.org/wiki/Insertion_sort,它对于几乎排序的数组具有 O(n) 复杂度。

在您的情况下,通过利用时间凝聚力插入排序可以提供最快的结果。它用于http://en.wikipedia.org/wiki/Sweep_and_prune

从上面的链接:

在许多应用程序中,物理实体的配置从一个时间步到下一个时间步变化很小。许多物体可能根本不动。算法的设计使得在前一个时间步中完成的计算可以在当前时间步中重复使用,从而更快地完成计算。

所以在这种情况下插入排序是最好的(或者在最好的情况下使用 O(n) 的类似排序)

于 2013-04-06T16:31:34.047 回答