渲染中最先进的剔除和批处理技术

9
我目前正在升级和重构一个OpenGL渲染引擎。该引擎用于可视化建筑数据的大型场景(包括内部的建筑物),对象数量可能相当大。与任何建筑物一样,墙壁内有许多被遮挡的对象,自然情况下只能看到与您在同一房间中的对象或者如果您在室外则只能看到外部。这就需要通过遮挡剔除和视锥体剔除来遮挡大量对象。
同时,存在许多可以批处理的重复几何图形,并且许多对象可以使用实例化渲染进行渲染。
在我看来,将渲染批处理和剔除结合起来是很困难的。如果您在同一VBO中批处理太多对象,则难以在CPU上剔除对象以跳过渲染该批次。如果同时跳过CPU上的剔除,则在GPU处理不可见对象时会有大量对象被处理。如果完全跳过批处理以更轻松地在CPU上进行遮挡剔除,则会产生不必要的高渲染调用次数。
我研究了现代图形技术中已有的技术和理论,以解决这些问题,但我没有找到任何具体的解决方案。我和一位同事想出了一个想法,即将批处理限制在相对接近的对象上,例如在一个房间内或半径为n米以内的所有椅子。这可以通过使用八叉树进行简化和优化。
有人能指导一下现代图形引擎中用于场景管理、剔除、批处理等技术吗?

让我先说一下,我对任何最先进的现代图形引擎都没有了解。但这似乎是一个没有单一解决方案的问题,相反,它通常可以通过将多种方法进行拼接和切换来解决,以提供给定场景的最佳质量/性能。因为在压力下,质量和性能总是互相排斥的。我通常通过将所有内容(!)批处理到视锥体友好块(对于您来说:房间)中来解决我的绘制调用,使用纹理数组等等在静态架构环境中非常有帮助。 - Full Frontal Nudity
1个回答

7
互联网上有很多关于截锥体和遮挡剔除的信息,其中大部分来自游戏开发者。以下是一些文章列表,可以帮助您入门: 我的(相当快的)渲染器的工作原理类似于这个。
  1. 集合:将要渲染的所有道具发送到渲染器。
  2. 视锥体剔除:渲染器使用多个线程并行地从列表中剔除不可见的道具。
  3. 遮挡剔除:现在你可以在 CPU 上执行遮挡剔除(我还没有实现它,因为现在我不需要它)。如何高效地执行这项操作的详细信息可以在 Killzone 和 Crysis 幻灯片中找到。一种解决方案是从 GPU 中读取上一帧的深度缓冲区,然后在其上光栅化对象的边界框以检查对象是否可见。
  4. 分割:由于你现在知道哪些对象实际上必须被渲染,因为它们是可见的,所以你必须按网格对它们进行分割,因为每个网格都有不同的材质或纹理(否则它们将被合并为单个网格)。
  5. 批处理:现在你有一个要渲染的网格列表。你可以按以下方式对它们进行排序:
    • 按深度(这可以在道具级别而不是网格级别上完成),以节省填充率(如果你的片段着色器非常简单,我不建议这样做)。
    • 按网格(因为可能存在多个相同网格的实例,并且这将使添加实例化变得容易)。
    • 按纹理,因为纹理切换非常昂贵。
  6. 渲染:遍历分割后的网格并对它们进行渲染。

正如“全裸”已经说过的那样:没有完美的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接