我目前正在升级和重组一个OpenGL渲染引擎。该引擎用于可视化大型建筑数据场景(带有内部的建筑物),对象的数量可能会变得相当大。就像任何建筑一样,墙壁内有很多遮挡的物体,你自然只能看到和你在同一个房间里的物体,如果你在外面,你也只能看到外面的物体。这就留下了大量应该通过遮挡剔除和截锥体剔除来遮挡的物体。
同时,有很多重复的几何图形可以在渲染批次中批处理,也有很多对象可以通过实例渲染来渲染。
在我看来,以最佳方式结合渲染批处理和剔除是很困难的。如果在同一个VBO中批量处理太多对象,则很难在CPU上筛选对象以跳过渲染该批处理。同时,如果你跳过cpu上的剔除,很多对象将被GPU处理,而它们是不可见的。如果你为了更容易地在CPU上剔除而完全跳过批处理,将会有不必要的大量渲染调用。
我对现有的技术和理论做了一些研究,关于如何在现代图形中解决这些问题,但我还没有找到任何具体的解决方案。我和同事想到的一个想法是,将批次限制在彼此相对较近的物体上,例如房间里的所有椅子或n个会议半径内的物体。这可以通过使用oct-tree来简化和优化。
有没有人有任何指针用于场景管理,筛选,批处理等技术在最先进的现代图形引擎?
网上有很多关于截锥体和遮挡剔除的信息。其中大部分来自游戏开发者。下面是一些可以帮助你入门的文章:
- http://de.slideshare.net/guerrillagames/practical-occlusion-culling-in-killzone-3
- http://de.slideshare.net/TiagoAlexSousa/secrets-of-cryengine-3-graphics-technology
- http://de.slideshare.net/umbra3/siggraph 2011年-艾伦-阻塞扑杀后
- http://de.slideshare.net/Umbra3/visibility-optimization-for-games
- http://de.slideshare.net/umbra3/chen - silvennoinen tatarchuk多边形-汤-世界- siggraph - 2011 -发展- -实时呈现课程
- http://de.slideshare.net/DICEStudio/culling-the-battlefield-data-oriented-design-in-practice
- http://www.cse.chalmers.se/~ uffe/vfc.pdf
我的(相当快的)渲染器的工作原理类似于:
- Collection:发送你想要渲染的所有道具到渲染器。
- Frustum culling:渲染器使用多线程并行地从列表中剔除不可见的道具。
- 遮挡剔除:现在你可以在CPU上做遮挡剔除(我还没有实现它,因为我现在不需要它)。关于如何有效地做到这一点的详细信息可以在《杀戮地带》和《孤岛危机》的幻灯片中找到。一种解决方案是从GPU中读取前一帧的深度缓冲区,然后将对象的边界框光栅化,以检查对象是否可见。
- 分割:既然你现在知道哪些对象实际上必须被渲染,因为它们是可见的,你必须按网格分割它们,因为每个网格有不同的材料或纹理(否则它们将合并成单个网格)。
-
批处理:现在你有一个网格列表要渲染。您可以对它们进行排序:
- 按深度(这可以在道具级别而不是网格级别上完成),以保存填充率(如果你的片段着色器非常简单,我不建议这样做)。
- 通过网格(因为可能有多个相同网格的实例,这将使它很容易添加实例)。
- 的纹理,因为纹理切换是非常昂贵的。
- Rendering:遍历你的分区网格并渲染它们。
正如《正面全裸》已经说过的:没有完美的解决方案。