ALCCLoadVolume:加载体积框
继承 AVolume,面板显示名为 LCC Load Volume。
与裁剪体、剖切面的关键区别在于作用阶段:裁剪与剖切只改变最终渲染结果,数据照常加载并上传显存;加载体积框作用在节点遍历阶段,落选节点根本不会被读取。因此它是三者中唯一能降低加载量与显存占用的工具。
| 头文件 | Tools/LCCLoadVolume.h |
| 基类 | AVolume |
| 蓝图 | Blueprintable / BlueprintType |
| 授权 | 专业版功能,未授权时不生效 |
一个加载体积框可同时作用于场景中的多个 LCC Actor。
Properties
| 属性 | 类型 | 说明 |
|---|---|---|
bEnabled | bool | 是否启用 |
Mode | ELoadRegion | Inside(只加载框内)或 Outside(排除框内) |
VolumeType | ELoadVolumeType | Box(盒体)或 Sphere(球体) |
取值含义见 ELoadRegion 与 ELoadVolumeType。
三个属性都没有 Setter,直接赋值即可。筛选在加载时生效,因此修改后需要重新加载数据。
边界精度
判定以节点为单位,不是逐 splat,因此边界比裁剪体粗:靠边的节点只要不满足条件就整个舍弃。
两种模式的判定方式不同:
| 模式 | 判定条件 | 边界表现 |
|---|---|---|
Inside | 节点完全落在框内才加载 | 实际保留范围略小于框 |
Outside | 节点与框有任何重叠即排除 | 实际排除范围略大于框 |
两边都偏保守,这是为了保证 LOD 切换时的稳定性。八叉树里子节点的包围盒总在父节点内部,相机远离时 LOD 会从子节点切到父节点。如果 Inside 用相交判定,父节点会因为部分重叠而被加载,把子节点已经排除掉的区域又放回来,视觉上就是拉远时突然冒出一块内容。Outside 用包含判定会有对称的问题。
需要精确边界时,在同一变换上再叠一个裁剪体:加载体积框负责减少加载量,裁剪体负责修整边缘。
运行时创建
ALCCLoadVolume* Volume = GetWorld()->SpawnActor<ALCCLoadVolume>(
ALCCLoadVolume::StaticClass(), Location, FRotator::ZeroRotator);
Volume->VolumeType = ELoadVolumeType::Box;
Volume->Mode = ELoadRegion::Inside;
Volume->bEnabled = true;
Volume->SetActorScale3D(FVector(20.0f, 20.0f, 10.0f));
Component->AddLoadVolume(Volume);
Component->Load(Path); // 必须在加载之前配置好
顺序很重要:筛选发生在加载阶段,Load() 之后再增删加载体积框或改属性都不会改变已加载的数据,需要重新加载。
// 修改筛选范围后重新加载
Volume->SetActorLocation(NewLocation);
Component->Refresh(); // 内部先 UnLoad 再 Load
Refresh() 的开销等同一次完整重新加载,见 ALCCActorBase::Refresh。
与裁剪体的选择
| 需求 | 用哪个 |
|---|---|
| 大场景只取一小块,要省显存和加载时间 | 加载体积框 |
| 挖洞、剖开外壳,需要精确边界 | 裁剪体 |
| 既要省显存又要精确边界 | 两者叠加,变换保持一致 |
| 运行时频繁开关效果 | 裁剪体(改 bEnabled 下一帧生效,无需重新加载) |
See Also
- ALCCClippingVolume:裁剪体
- ALCCSectionPlane:剖切面
- AddLoadVolume:Component 侧的增删接口
- 场景编辑 - 加载体积框:使用步骤与图示
- 版本与授权:授权范围