algorithm - 网格级最佳遮挡剔除的最有效算法?

标签 algorithm search graphics 3d

我是剔除新手。乍一看,大多数遮挡剔除算法似乎都是对象级的,而不是检查单个网格,这对于游戏渲染是实用的。

我正在寻找的是一种算法,它可以高精度地剔除单个对象中被给定视点遮挡的所有网格。它至少需要 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/

相关文章:

javascript - 如何对 2d for 循环进行排序并将结果输入斜边公式

java - 使用前缀树在 O(1) 中查找单个最近邻居?

search - 使用Elasticsearch在子文档中搜索术语

跨越多行的结果的 mysql 逻辑

algorithm - 近似最近邻时间复杂度

graphics - opencv默认使用图形卡

java - Canvas 和 JPanel 的区别

java - 如何实现最近使用的缓存

python - 将平面上的 3D 坐标转置到新的 2D 坐标系

java - 为什么我的 SSS 三角形求解器给出了一个完全错误的答案?