9

我目前正在升级和重组 OpenGL 渲染引擎。该引擎用于可视化建筑数据的大型场景(带有内部的建筑物),并且对象的数量会变得相当大。与任何建筑物一样,墙壁内有很多被遮挡的物体,您自然只能看到与您在同一房间内的物体,或者如果您在外面,则只能看到外部。这留下了大量应该通过遮挡剔除和截锥剔除来遮挡的对象。

同时有很多重复的几何体可以在渲染批处理中进行批处理,也有很多对象可以通过实例渲染进行渲染。

在我看来,很难以最佳方式结合渲染批处理和剔除。如果在同一个 VBO 中批处理太多对象,则很难在 CPU 上剔除对象以跳过渲染该批处理。同时如果你跳过cpu上的剔除,很多物体会在不可见的情况下被GPU处理。如果您完全跳过批处理以便更轻松地剔除 CPU,则会出现大量不必要的渲染调用。

我已经对现有技术和理论进行了一些研究,以了解如何在现代图形中解决这些问题,但我一直无法找到任何具体的解决方案。一个同事和我想出的一个想法是将批次限制在彼此相对靠近的物体上,例如房间内的所有椅子或 n 个会面半径内的所有椅子。这可以通过使用八叉树来简化和优化。

有没有人对最先进的现代图形引擎中用于场景管理、剔除、批处理等技术的任何指示?

4

1 回答 1

6

互联网上有很多关于截锥体和遮挡剔除的信息。其中大部分来自游戏开发者。以下是一些可以帮助您入门的文章列表:

我的(相当快的)渲染器的工作方式与此类似:

  1. Collection:将您要渲染的所有道具发送到渲染器。
  2. Frustum culling:渲染器使用多个并行线程从列表中剔除不可见的道具。
  3. 遮挡剔除:现在您可以在 CPU 上进行遮挡剔除(我还没有实现它,因为我现在不需要它)。有关如何有效执行此操作的详细信息,请参阅 Killzone 和 Crysis 幻灯片。一种解决方案是从 GPU 读回前一帧的深度缓冲区,然后光栅化其顶部对象的边界框以检查对象是否可见。
  4. 拆分:由于您现在知道实际必须渲染哪些对象,因为它们是可见的,因此您必须按网格拆分它们,因为每个网格都有不同的材质或纹理(否则它们将组合成一个网格)。
  5. 批处理:现在您有了要渲染的网格列表。您可以对它们进行排序:
    • 按深度(这可以在道具级别而不是网格级别上完成),以节省填充率(如果您的片段着色器非常简单,我不建议这样做)。
    • 通过网格(因为可能有同一个网格的多个实例,它可以很容易地添加实例)。
    • 按纹理,因为纹理切换非常昂贵。
  6. 渲染:遍历您的分区网格并渲染它们。

正如“正面全裸”所说:没有完美的解决方案。

于 2014-05-02T12:23:16.077 回答