CullingGroup 提供一种将系统集成到 Unity 剔除和__ LOD__见__细节级别__。
See in Glossary 管线中的方法。这可用于许多目的;例如:
API 的工作原理是让您提供一系列包围球体。然后,会计算这些球体相对于特定摄像机的可见性,同时还会计算出一个 “距离范围” 值,这个值可以当作是一个细节层次(LOD)等级数值来处理。
在考虑如何将 CullingGroup 应用于项目时,请考虑 CullingGroup 设计的以下方面。
CullingGroup 为其计算可见性的所有体积都由包围球体定义;实际上,由位置(球体中心)和半径值定义。出于性能原因,不支持其他包围形状。在实践中,这意味着您将定义一个球体来完全包围希望剔除的对象。如果需要更紧密拟合,请考虑使用多个球体来覆盖对象的不同部分,并根据所有球体的可见性状态做出决定。
为了评估可见性,CullingGroup 需要知道应该从哪个摄像机可见性开始计算。目前,单个 CullingGroup 仅支持单个摄像机。如果需要评估多个摄像机的可见性,应为每个摄像机使用一个 CullingGroup 并合并结果。
CullingGroup 将仅基于视锥体剔除和静态遮挡剔除来计算可见性。它不会将动态对象视为潜在遮挡物。
CullingGroup 能够计算某个参考点(例如,摄像机或玩家的位置)与每个球体上最近点之间的距离。此距离值不会直接提供给您,而是使用您提供的一组阈值来量化,以便计算离散的“距离带”整数结果。目的是将这些距离带解读为“近距离”、“中距离”、“远距离”等。
一个对象从一个区域移到另一个区域时,CullingGroup 将提供回调,让您有机会进行某些操作,例如将该对象的行为更改为 CPU 使用强度较低的操作。
超出最后一个距离的任何球体都将被视为不可见,这使您可以轻松构建一个剔除实现来完全停用非常远的对象。如果不想要此行为,只需将最终阈值设置为无限远的距离。
每个 CullingGroup 仅支持一个参考点。
CullingGroup API 不允许您对场景进行更改后立即请求包围球体的新可见性状态。出于性能原因,CullingGroup 仅在执行整个摄像机剔除期间计算新的可见性信息;此时,您可以通过回调或 CullingGroup 查询 API 来获取信息。实际上,这意味着您应该以异步方式处理 CullingGroup。
提供给 CullingGroup 的包围球体数组将由 CullingGroup 引用,而不是复制。这意味着您应该保留对传递给 SetBoundingSpheres 的数组的引用,并可修改此数组的内容,而无需再次调用 SetBoundingSpheres。如果需要多个 CullingGroup 来计算同一组球体的可见性和距离(例如,对于多个摄像机),那么让所有 CullingGroup 共享相同的包围球体数组实例会很高效。