3D场景中快速可见性计算的空间数据结构——递归地将空间分成两半。实时渲染的经典方法。
二叉空间分割 (BSP)
在构建用于 VFX 或交互式渲染的复杂 3D 场景时,很快就会遇到一个瓶颈:从某个位置可以看到哪些几何体,以及如何实时计算?这时二叉空间分割 (Binary Space Partition, BSP) 就派上用场了——它是一种算法,可以递归地将 3D 空间分成两半,从而构建出一种树状结构。每个分区都由一个分隔空间的平面定义。对象要么落在其中一侧,要么落在另一侧,或者被自身分割。结果是:极其快速的可视性检查和剔除操作。
在实践中,它的工作原理是这样的:你有一个复杂的室内场景,有很多房间和墙壁——没有任何 GPU 愿意渲染那些位于厚墙后面的所有多边形。BSP 结构可以让你通过几次遍历来确定从当前视点来看哪些几何体簇是相关的。遍历开销很小,因为你只需要遵循一个树结构,而不是检查每一个独立的图元。这就是为什么 BSP 在 Quake 或 Unreal Tournament 等游戏引擎中很经典——以及为什么它至今仍在某些实时 VFX 流水线中得到应用,例如在体积渲染或程序化破坏场景的可视性信息预计算中。
理解这一点很重要:BSP 主要不是一种渲染结构。它是一种空间组织方法——类似于高度优化的空间索引。现代应用中,BSP 较少用于经典的渲染(因为现在 BVH 树更有效),但它在碰撞检测、光线投射和静态几何体预处理方面仍然发挥着作用。在 VFX 流水线中,人们经常隐式地使用 BSP 概念:在针对复杂障碍物的粒子剔除、构造实体几何 (Constructive Solid Geometry, CSG) 工作流程中,或者当需要快速查询某个效果位于哪个体积区域时。
构建一个好的 BSP 的核心问题在于在哪里设置分割平面。选择不当的平面会导致树结构不平衡,从而降低性能。因此,专业人士现在使用启发式方法,或者让工具自动计算最佳分割。内存效率也是一个需要考虑的问题——非常精细的 BSP 树可能会占用大量内存,因此在生产流水线中,人们通常需要在深度和内存占用之间寻找平衡。