【问题标题】:Most efficient algorithm for mesh-level, optimal occlusion culling?网格级最佳遮挡剔除的最有效算法?
【发布时间】:2008-11-25 15:01:33
【问题描述】:

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

我正在寻找的是一种算法,该算法可以高精度地剔除单个对象内对于给定视点被遮挡的所有网格。它至少需要 O(n log n),简单的逐个网格比较 (O(n^2)) 太慢了。

我注意到 Blender GUI 会为您实时识别被遮挡的网格,即使您使用包含 10,000 多个网格的大型对象也是如此。请问那里用的是什么算法?

【问题讨论】:

    标签: algorithm search graphics 3d


    【解决方案1】:

    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 callback, void* userData, PHY__Vector4 *planes, int nplanes, int occlusionRes)

    Bullet Physics SDK 在 Bullet/Extras/CDTestFramework 中有一些 C++ 示例代码。

    【讨论】:

      【解决方案2】:

      你有没有研究过Octrees之类的东西?

      【讨论】:

      • 四叉树可能就足够了,因为它正在寻找二维(而不是 3)的重叠。
      【解决方案3】:

      之所以不在网格级别进行剔除,是因为网格是一个非常愚蠢的渲染器级别对象,而游戏对象处于场景级别,所有剔除都发生在场景级别。没有做出网格级别剔除决策,它们只是一种在需要渲染对象时批处理具有相似着色器状态的图元的方法。

      如果您确实需要在网格级别进行剔除,那么您可能希望为每个网格创建一个对象,然后创建一个包含网格对象的组对象。请注意,您实际上可能会失去性能,因为在网格级别进行剔除通常是不值得的;它可能会中断向硬件传输的数据流。

      【讨论】:

        【解决方案4】:

        通常您要做的第一件事是查看网格是否有可能相互遮挡。通常使用简单的边界原语(边界框或边界球)。如果我没记错的话,Octrees 将对此有所帮助。

        【讨论】:

          【解决方案5】:

          我尝试了简单的方法,它实际上对于我的应用来说已经足够快了。

          对于网格中的每个三角形,检查是否被网格中的任何其他三角形遮挡,因此 O(n2)。 (我仅通过检查每个三角形的中心点是否被遮挡获得了高精度结果,尽管如果准确性很重要,您至少也应该检查三角形角顶点)。

          在奔腾 4 机器 (c++) 上,~10,000 个三角形的二进制 STL 对象大约需要 1 分钟才能完成

          通过首先对三角形进行排序,例如按面积大小或与视点的距离(更有可能被遮挡,因此您可以跳过更多检查),该算法可以优化高达约 40%。

          下一个优化步骤是将三角形放入八叉树中,这将大大减少遮挡检查的次数。

          【讨论】:

            猜你喜欢
            • 2011-10-22
            • 2011-06-27
            • 2014-09-22
            • 2011-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多