我是剔除新手。乍一看,大多数遮挡剔除算法似乎都是对象级的,而不是检查单个网格,这对于游戏渲染是实用的。
我正在寻找的是一种算法,它可以高精度地剔除单个对象中被给定视点遮挡的所有网格。它至少需要 O(n log n),简单的逐个网格比较 (O(n^2)) 太慢了。
我注意到 Blender GUI 会实时为您识别被遮挡的网格,即使您处理的大型对象超过 10,000 个网格。那里使用了什么算法,请告诉我?
最佳答案
Blender 基于 Bullet 物理库中的动态 AABB 树加速结构执行视锥体剔除和遮挡剔除。遮挡物和对象由它们的边界体积(轴对齐边界框)表示。
给定相机视锥体,视锥体剔除只是遍历 AABB 树。
遮挡剔除基于遮挡缓冲区,一种使用非常简单的软件渲染器初始化的深度缓冲区:使用动态 AABB 树加速结构的基本光线追踪器。您可以选择遮挡缓冲区的分辨率来权衡准确性与效率。
另请参阅文档 http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.49/Game_Engine#Performance
来自 Blender 源代码树的 Blender 实现: blender\source\gameengine\Physics\Bullet\CcdPhysicsEnvironment.cpp方法 bool CcdPhysicsEnvironment::cullingTest(PHY_CullingCallback 回调, void* userData, PHY__Vector4 *planes, int nplanes, int occlusionRes)
Bullet Physics SDK 在 Bullet/Extras/CDTestFramework 中有一些 C++ 示例代码。
关于algorithm - 网格级最佳遮挡剔除的最有效算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/317622/