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

Kri*_*eth 8 opengl batching batch-processing culling occlusion-culling

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

同时,有许多可以在渲染块中进行批处理的重复几何体,以及可以使用实例渲染渲染的许多对象.

我看待它的方式,很难以最佳方式组合渲染和剔除.如果在同一个VBO中批处理太多对象,则很难剔除CPU上的对象以跳过渲染该批处理.同时,如果你跳过cpu上的剔除,GPU会在看不到它们时处理很多对象.如果为了更容易地剔除CPU而过度跳过批处理,则会有不必要的大量渲染调用.

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

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

Tar*_*ara 5

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

我的(非常快)渲染器的工作方式类似于:

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

正如"Full Frontal Nudity"已经说过:没有完美的解决方案.