跳到主要内容

流式 SOG

流式 SOG 在全局预算内,为场景各区域动态加载合适的细节层级,显著减少大型场景内存并改善渲染性能。

工作原理​

流程为:

  1. 预生成不同细节版本。
  2. 用空间树组织以高效加载。
  3. 按相机距离动态加载和卸载,并符合全局预算。
  4. 每个区域只渲染选定层级。

这让原本受内存限制无法显示的巨大场景得以渲染。

创建流式数据​

需生成 lod-meta.json 空间树,组织多个 LOD,参见格式规范。层级来源有两种:

  • 提供自有 LOD:多个逐渐变粗的文件,0 最精细,数字越大越粗,例如训练中生成或单独导出。
  • SplatTransform 生成:从单个高质量文件简化出低细节,无需自行制作。

再由 SplatTransform 组织为流式格式,步骤参见生成流式 SOG。

实时示例​

体验以下示例:

  • 基础流式 SOG:不同细节层级加载。
流式 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,可添加到任意实体:

配置步骤​

  1. 将脚本添加到实体。
  2. 设置 splatUrl 指向外部托管的流式数据。
外部托管

目前数据需外部托管,不能作为编辑器资源;未来原生支持会移除此限制。

质量设置​

脚本提供四种质量/性能预设,可指定:

  • 加载哪些层级。
  • 各层显示距离。

便于针对平台设备精细平衡画质与性能。

自定义着色器效果​

项目使用引擎 GSplat 脚本演示自定义效果。

具体采用 Reveal Radial 及其基类,制作渐显动画:

  • 从中心向外扩散径向波。
  • 先逐步出现彩色小点。
  • 再将粒子抬起并高亮,最后落回原状。

展示着色器系统为高斯泼溅制作视觉效果的灵活性。

未来编辑器改进​

原生支持计划包括:

  • 直接导入:上传流式文件,无需外部托管。
  • 可视化配置:通过 UI 而非脚本属性调整 LOD。
  • 编辑器预览:在视口直接测试加载行为。

优点​

  • 性能更好:减少大型场景内存和渲染开销。
  • 可扩展:动态细节支持更大场景。
  • 灵活:精细控制距离和加载行为。
  • 优化加载:只读取当前视图所需内容。

另请参见​