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 側的增刪接口
- 場景編輯 - 加載體積框:使用步驟與圖示
- 版本與授權:授權範圍