流式 SOG
流式 SOG 在全局预算内,为场景各区域动态加载合适的细节层级,显著减少大型场景内存并改善渲染性能。
工作原理
流程为:
- 预生成不同细节版本。
- 用空间树组织以高效加载。
- 按相机距离动态加载和卸载,并符合全局预算。
- 每个区域只渲染选定层级。
这让原本受内存限制无法显示的巨大场景得以渲染。
创建流式数据
需生成 lod-meta.json 空间树,组织多个 LOD,参见格式规范。层级来源有两种:
- 提供自有 LOD:多个逐渐变粗的文件,0 最精细,数字越大越粗,例如训练中生成或单独导出。
- SplatTransform 生成:从单个高质量文件简化出低细节,无需自行制作。
再由 SplatTransform 组织为流式格式,步骤参见生成流式 SOG。
实时示例
体验以下示例:
- 基础流式 SOG:不同细节层级加载。
- 带球谐的流式 SOG:同时加载球谐数据。
启用
将 lod-meta.json 资源加载到 GSplat 组件即可,无需额外配置。
控制 LOD 行为
如何选择 LOD
引擎按区域到相机距离选择层级。组件的 lodBaseDistance 内用 LOD 0,后续距离按 lodMultiplier 倍增。默认 5 和 3,LOD 1 在 5 单位开始,LOD 2 在 15,LOD 3 在 45:
entity.gsplat.lodBaseDistance = 10; // LOD 0 out to 10 units
entity.gsplat.lodMultiplier = 4; // then LOD 1 to 40 units, LOD 2 to 160, ...
提高任一值让细节保留更远,但内存增加。base 最小 0.1,multiplier 最小 1.2。距离按 FOV 补偿,视角越广,对象越小,越早采用粗层。
这些距离与全局预算的关系由预算模式决定。
预算模式
全局 splatBudgetMode 选择:
app.scene.gsplat.splatBudgetMode = pc.GSPLAT_BUDGET_LIMIT;
- GSPLAT_BUDGET_TARGET(默认):无论相机位置,都提高细节直到用满。用统一系数调整全部资源距离,因此指定距离只决定衰减形状和资源间分配,不决定细节总量。
- GSPLAT_BUDGET_LIMIT:由距离决定细节,只有超预算才降低。远处资源只使用距离所需数量,剩余预算闲置,不会为用满预算而加载更细层。
预算 ≤ 0 表示不限制:目标模式使用最精细,限制模式只按距离。
场景级控制
Scene.gsplat 提供:
- 性能参数。
- 调试可视化。
- 内存控制。
- 流式行为。
// Access scene-level gsplat settings
const gsplatSettings = app.scene.gsplat;
// Configure settings as needed
// (See API documentation for available properties)
最重要的是全局预算,按上述模式作为填满的目标或上限,自动平衡全部资源,参见全局预算。
编辑器中使用
编辑器原生支持计划在后续加入,目前可在脚本中通过引擎 API 使用。
示例项目
以下项目演示编辑器中的流式 SOG:
项目展示大型场景及自定义渐显着色器。
使用 Streamed GSplat 脚本
示例包含 streamed-gsplat.mjs,可添加到任意实体:
配置步骤
- 将脚本添加到实体。
- 设置 splatUrl 指向外部托管的流式数据。
目前数据需外部托管,不能作为编辑器资源;未来原生支持会移除此限制。
质量设置
脚本提供四种质量/性能预设,可指定:
- 加载哪些层级。
- 各层显示距离。
便于针对平台设备精细平衡画质与性能。
自定义着色器效果
项目使用引擎 GSplat 脚本演示自定义效果。
具体采用 Reveal Radial 及其基类,制作渐显动画:
- 从中心向外扩散径向波。
- 先逐步出现彩色小点。
- 再将粒子抬起并高亮,最后落回原状。
展示着色器系统为高斯泼溅制作视觉效果的灵活性。
未来编辑器改进
原生支持计划包括:
- 直接导入:上传流式文件,无需外部托管。
- 可视化配置:通过 UI 而非脚本属性调整 LOD。
- 编辑器预览:在视口直接测试加载行为。
优点
- 性能更好:减少大型场景内存和渲染开销。
- 可扩展:动态细节支持更大场景。
- 灵活:精细控制距离和加载行为。
- 优化加载:只读取当前视图所需内容。