🔥 SuperSplat 架构深度解析:8.2K Star 的浏览器端 3D 高斯泼溅编辑器,PlayCanvas 如何用纯 WebGL 重新定义三维内容工作流
8.2K Star · PlayCanvas 团队 · MIT License · TypeScript 92.6% · v2.26.1 · 145+ Releases
前言:一个填补生态空白的项目
2023 年 SIGGRAPH 大会上,3D Gaussian Splatting(3DGS)横空出世------用数百万个半透明椭球体重建真实场景,实时渲染 60fps+,彻底碾压 NeRF。
但有一个关键问题被忽视了:生成之后怎么编辑?
传统 3DGS 管线是单向的------扫描 → 训练 → 输出 .ply 文件 → 结束。没有编辑器,没有优化工具,没有发布管线。你拿到的是一个几百 MB 的二进制文件,除了「看」,什么都做不了。
PlayCanvas 团队看到了这个空白。2024 年初,他们开源了 SuperSplat------全球首款浏览器端 3D 高斯泼溅编辑器。
8.2K Star、886 Fork、145+ 个版本迭代,平均每 3-4 天发布一版。
本文从 3DGS 技术原理、SuperSplat 架构设计、渲染管线、编辑工具链四个维度,做一次完整的深度拆解。
一、3D Gaussian Splatting 技术原理:为什么不是 NeRF?
1.1 核心思想
3D Gaussian Splatting 的核心是用三维高斯分布来表示三维空间中的每一个点:
每个高斯函数 = {
位置(均值 μ): 3D 空间中的坐标 [x, y, z]
形状(协方差矩阵 Σ):椭球体的朝向和大小
颜色(球谐函数 SH):依赖视角的颜色表现
透明度(α): 控制遮挡和混合
}
1.2 渲染管线
┌─────────────────────────────────────────────────────────┐
│ 3D 空间中的高斯椭球体 │
│ (位置 + 协方差矩阵 + RGB 球谐函数 + Alpha) │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ "泼溅"(Splat) 到 2D 图像平面 │
│ (协方差矩阵 3D→2D 投影变换 → 屏幕空间 2D 椭圆) │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ α-blending 混合叠加 │
│ (按深度后往前排序 → 逐像素 α 混合) │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 高质量新视角图像输出 │
└─────────────────────────────────────────────────────────┘
关键区别 :传统 3D 渲染走的是三角形光栅化(Mesh + Shader),3DGS 走的是逐高斯椭球 α-blending------完全不依赖多边形网格。
1.3 为什么 3DGS 胜过 NeRF?
| 维度 | NeRF | 3D Gaussian Splatting |
|---|---|---|
| 渲染速度 | 需要逐射线积分,很慢 | 直接泼溅 + 排序,实时 60fps+ |
| 训练时间 | 几小时到几天 | 几十分钟 |
| 编辑能力 | 隐式表示,无法编辑 | 显式高斯点,可直接操作 |
| 文件格式 | 神经网络权重 | 标准 PLY 点云格式 |
| 硬件要求 | 训练需高端 GPU | 训练需 GPU,渲染消费级即可 |
| 显式几何 | 无 | 有(虽然是椭球体) |
1.4 3DGS 的局限性
| 局限 | 说明 |
|---|---|
| 文件体积大 | 百万级高斯,典型场景 200MB-1GB |
| 编辑工具匮乏 | 生成后难以修改------这正是 SuperSplat 填补的空白 |
| 遮挡处理 | 复杂遮挡场景仍有伪影 |
| 镜面反射 | 球谐函数对高光表现不完美 |
| 物理仿真 | 无显式网格,碰撞/物理交互困难 |
二、🔥 项目架构:事件驱动 + 纯 TypeScript + 自建 UI
SuperSplat 没有使用 React/Vue,而是选择了纯 TypeScript + 自建事件总线的技术路线。
2.1 技术栈全景
| 分类 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 核心引擎 | PlayCanvas Engine | 2.18.1 | WebGL 2.0 实时渲染 |
| 主语言 | TypeScript | 92.6% | 严格类型检查 |
| UI 框架 | @playcanvas/pcui | 6.1.4 | PlayCanvas 自家 UI 库(非 React) |
| 高斯处理 | @playcanvas/splat-transform | 2.1.1 | WASM 协处理器 |
| 国际化 | i18next | 26.1.0 | 9 种语言 |
| 构建工具 | Rollup | 4.60.3 | 模块打包 |
| CSS 预处理 | Sass | 1.99.0 | 样式 |
| 代码规范 | ESLint | 10.3.0 + @typescript-eslint | 代码检查 |
| Node 环境 | Node.js | ≥ 20.19.0 | 运行时 |
2.2 源码目录架构
supersplat/src/
├── core/ # 核心引擎层
│ ├── events.ts # 中央事件总线(系统神经中枢)
│ ├── edit-history.ts # 异步操作队列(Undo/Redo 保障)
│ ├── scene.ts # 3D 场景管理
│ └── splat/ # 高斯数据结构与管理
│
├── shaders/ # 自定义着色器(12 种)
│ ├── splat-shader.ts # 主渲染着色器(核心中的核心)
│ ├── splat-overlay-shader.ts # 选中高亮覆盖层
│ ├── intersection-shader.ts # 射线-高斯相交检测(鼠标拾取)
│ ├── position-shader.ts # 高斯中心点渲染(点云模式)
│ ├── infinite-grid-shader.ts # 无限网格地面
│ ├── box/sphere-shape-shader.ts # 3D 选区可视化
│ ├── outline-shader.ts # 选中物体轮廓描边
│ └── bound/debug/blit-shader.ts # 调试与帧缓冲
│
├── tools/ # 编辑工具(11 个)
│ ├── select/ # 选择工具(8 种)
│ │ ├── rect-select.ts # 矩形框选(屏幕空间)
│ │ ├── poly-select.ts # 多边形框选(屏幕空间)
│ │ ├── lasso-select.ts # 套索选择(屏幕空间)
│ │ ├── brush-select.ts # 笔刷选择(3D 涂抹)
│ │ ├── sphere-select.ts # 球体选择(3D 空间)
│ │ ├── box-select.ts # 立方体选择(3D 空间)
│ │ ├── flood-fill.ts # 洪水填充(选相似高斯)
│ │ └── eyedropper.ts # 颜色吸管
│ ├── transform/ # 变换工具(3 种)
│ │ ├── translate.ts # 平移
│ │ ├── rotate.ts # 旋转
│ │ └── scale.ts # 缩放
│ └── measure.ts # 空间距离测量
│
├── ui/ # UI 系统(PCUI)
│ ├── localization.ts # 多语言注册
│ ├── panels/ # 7 个独立面板
│ │ ├── data-panel.ts # 数据面板(属性编辑)
│ │ ├── view-panel.ts # 视图面板
│ │ ├── timeline-panel.ts # 时间线面板
│ │ ├── scene-panel.ts # 场景面板
│ │ └── ...
│ └── components/ # UI 组件
│
├── io/ # 文件 I/O
│ ├── import-ply.ts # PLY 导入
│ ├── import-splat.ts # SPLAT 导入
│ ├── import-sog.ts # SOG 导入(WebP 压缩)
│ ├── export-ply.ts # PLY 导出
│ ├── export-sog.ts # SOG 导出
│ └── sog-codec.ts # SOG WebP 编解码(WASM)
│
└── operations/ # 操作层(编辑操作的原子单元)
├── delete.ts # 删除高斯
├── transform.ts # 变换操作
├── color.ts # 颜色修改
└── ...
2.3 事件驱动启动流程
┌─────────────────────────────────────────────────────────┐
│ SuperSplat 启动序列 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. Events(中央事件总线) │
│ └── 所有模块通过事件通信,零直接依赖 │
│ │
│ 2. EditHistory(异步操作队列) │
│ └── editQueue 串行化所有编辑操作 │
│ └── 保证 Undo/Redo 确定性 │
│ │
│ 3. localizeInit(多语言初始化) │
│ └── i18next 加载语言包 │
│ │
│ 4. EditorUI(界面构建) │
│ └── PCUI 框架创建 7 个独立面板 │
│ │
│ 5. createGraphicsDevice(GPU 设备创建) │
│ └── WebGL2 设备,antialias:false, depth:false │
│ │
│ 6. Scene(场景初始化) │
│ └── 加载高斯数据到 GPU │
│ │
│ 7. ToolManager(工具注册) │
│ └── 11 个工具通过统一接口注册 │
│ │
└─────────────────────────────────────────────────────────┘
2.4 事件总线设计:模块解耦的关键
typescript
// 事件驱动的模块解耦
// 颜色系统监听 → events.on('selectedClr', updateColorPanel)
// 背景系统监听 → events.on('setBgClr', updateBackground)
// 数据面板监听 → events.on('selection.changed', refreshDataPanel)
// 没有任何模块直接 import 其他业务模块
// 所有通信通过 Events 实例中转
这个设计让 SuperSplat 的模块化程度极高------添加新工具只需实现接口并加一行注册代码,无需修改任何现有模块。
2.5 异步操作串行化:Undo/Redo 的确定性保障
问题:多个异步操作(如旋转 + 撤销)同时操作 GPU 状态 → 竞争条件
解决方案:editQueue 将所有编辑操作排入 EditHistory 队列
┌──────────────────────────────────────────────┐
│ 用户操作 → editQueue.enqueue(operation) │
│ EditHistory 按顺序执行 │
│ 每次 Undo/Redo 回放到精确的历史状态 │
│ GPU 状态始终与操作历史一致 │
└──────────────────────────────────────────────┘
三、🔥 12 种自定义着色器:为 3DGS 量身定制的渲染管线
3DGS 走的不是传统三角形光栅化管线,因此 SuperSplat 基于 PlayCanvas 实现了 12 个自定义着色器。
3.1 核心渲染着色器
| 着色器 | 代码量 | 功能 |
|---|---|---|
| splat-shader.ts | 8.2KB | 主渲染核心。3D→2D 投影(协方差矩阵转 2D 椭圆)、α 值计算、深度排序(后往前混合)、自适应大小(LOD 效果) |
| splat-overlay-shader.ts | 6.3KB | 单独渲染选中高亮状态的覆盖层 |
| intersection-shader.ts | --- | 射线与高斯相交检测,实现鼠标精准拾取 |
| position-shader.ts | --- | 高斯中心点渲染,用于点云模式显示 |
3.2 辅助着色器
| 着色器 | 功能 |
|---|---|
| infinite-grid-shader.ts | 无限网格地面,提供空间参考 |
| box-shape-shader.ts | 盒状选择区域的 3D 可视化 |
| sphere-shape-shader.ts | 球状选择区域的 3D 可视化 |
| outline-shader.ts | 选中物体的轮廓描边,提升可见度 |
| bound-shader.ts | 边界框可视化 |
| debug-shader.ts | 法线/深度调试渲染 |
| blit-shader.ts | 帧缓冲复制(截图导出用) |
3.3 🔥 性能关键决策:关闭深度测试
typescript
// 创建 WebGL2 设备时的关键参数
createGraphicsDevice(canvas, {
antialias: false, // 关闭抗锯齿
depth: false, // 关闭深度缓冲 ← 关键!
stencil: false // 关闭模板缓冲
})
为什么关闭深度测试?
因为 3DGS 的渲染方式是 α-blending(后往前排序混合),不是传统 Z-buffer 深度测试。每个高斯椭球体是半透明的,需要按深度排序后逐个混合到帧缓冲中。深度缓冲在这里完全多余,关闭后大幅节省 GPU 带宽。
3.4 主渲染着色器核心流程
┌─────────────────────────────────────────────────────────┐
│ splat-shader.ts 渲染流程 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. 接收高斯数据 │
│ 位置(μ) + 协方差(Σ) + 球谐颜色(SH) + 透明度(α) │
│ │
│ 2. 3D→2D 投影变换 │
│ 协方差矩阵 × 视图矩阵 × 投影矩阵 → 2D 椭圆参数 │
│ (中心点 + 长轴/短轴 + 旋转角度) │
│ │
│ 3. 深度排序(CPU 端) │
│ 按深度值后往前排序 → 保证正确的 α 混合顺序 │
│ │
│ 4. 逐高斯渲染 │
│ 在 Fragment Shader 中计算每个像素的高斯贡献值 │
│ color = SH(方向) × gaussian_2d(x, y) × α │
│ │
│ 5. α-blending 混合 │
│ result = src × srcAlpha + dst × (1 - srcAlpha) │
│ │
└─────────────────────────────────────────────────────────┘
四、🔥 11 个编辑工具:选择 × 变换 × 测量
4.1 工具分类总览
┌──────────────────────────────────────────────────────────┐
│ SuperSplat 编辑工具生态 │
├──────────────────────────────────────────────────────────┤
│ │
│ 8 种选择工具 │
│ ├── 屏幕空间:矩形框选 / 多边形框选 / 套索选择 │
│ ├── 3D 空间:球体选择 / 立方体选择 │
│ ├── 智能:笔刷选择(3D 涂抹)/ 洪水填充(选相似高斯) │
│ └── 特殊:颜色吸管 │
│ │
│ 3 种变换工具 │
│ └── 平移 / 旋转 / 缩放 │
│ │
│ 1 种测量工具 │
│ └── 空间距离测量 │
│ │
└──────────────────────────────────────────────────────────┘
4.2 选择工具详解
| 工具 | 空间 | 工作原理 | 适用场景 |
|---|---|---|---|
| 矩形框选 | 2D 屏幕空间 | 在屏幕上画矩形,投射到 3D 空间选高斯 | 快速选大区域 |
| 多边形框选 | 2D 屏幕空间 | 画不规则多边形 | 精确选择不规则形状 |
| 套索选择 | 2D 屏幕空间 | 自由绘制闭合曲线 | 精细选择复杂轮廓 |
| 笔刷选择 | 3D 空间 | 3D 涂抹选中(像 PS 画笔) | 局部精细编辑 |
| 球体选择 | 3D 空间 | 3D 球体范围内的所有高斯 | 空间区域选择 |
| 立方体选择 | 3D 空间 | 3D 盒状范围内的所有高斯 | 裁剪场景边缘 |
| 洪水填充 | 智能算法 | 自动选择相似属性(颜色/位置)的高斯 | 一键选天空/地面 |
| 颜色吸管 | 智能算法 | 点选一个高斯,选中所有同色高斯 | 按颜色分类选择 |
4.3 选择工具的 GPU 加速机制
选择工具的核心优化在于避免 GPU 读回(Readback)瓶颈:
typescript
// 传统方案:GPU 渲染 → 读回 CPU → CPU 判断选区 → 性能极差
// SuperSplat 方案:使用独立的 2D maskCanvas 进行像素级选区运算
maskCanvas.globalCompositeOperation = 'copy'; // 避开 GPU 读回
// 所有选区运算在 2D Canvas 上完成,完全不走 GPU 回读
4.4 工具注册机制
typescript
// 统一接口 → ToolManager 注册
// 添加新工具只需:
// 1. 实现 ITool 接口
// 2. 在 ToolManager 中加一行注册代码
// 无需修改任何现有模块(事件驱动解耦)
五、文件格式矩阵:PLY / SPLAT / SOG 三格式工作流
5.1 格式对比
| 特性 | .ply | .splat | .sog(自研) |
|---|---|---|---|
| 性质 | 通用点云格式 | PlayCanvas 紧凑格式 | SuperSplat 优化格式 |
| 压缩方式 | 无(原始 ASCII/Binary) | 紧凑二进制 | WebP 图像压缩 |
| 典型体积 | 300MB-1GB | 100-300MB | 60-100MB(↓60-80%) |
| 加载速度 | 慢(需解析大量数据) | 快 | 最快 |
| 数据完整性 | 完整(所有高斯属性) | 保留核心属性 | 完整 + 编辑元数据 |
| 工具兼容性 | 所有 3DGS 工具 | PlayCanvas 生态 | 仅 SuperSplat |
| 元数据支持 | 无 | 无 | 支持(注释/相机路径) |
| 适用场景 | 训练输出/跨工具交换 | Web 发布 | SuperSplat 项目存档 |
5.2 SOG 格式:SuperSplat 的核心创新
SOG = SuperSplat Optimized Gaussian
这是 SuperSplat 自研的优化格式,关键创新在于:
PLY 格式(传统):
├── 每个高斯存储:位置(3×float) + 协方差(6×float) + 颜色(3×uint8) + 透明度(1×float)
├── 数据量:约 50 bytes/高斯
└── 100 万高斯 ≈ 50MB
SOG 格式(自研):
├── 将高斯数据编码为图像像素
├── 使用 WebP 图像压缩算法
├── WebPCodec.wasm 进行编解码
├── 数据量:约 10-20 bytes/高斯
└── 100 万高斯 ≈ 10-20MB(↓60-80%)
WebP 编解码 :通过 @playcanvas/splat-transform 中的 WebAssembly 模块实现,在浏览器中以接近原生的速度完成编解码。
5.3 导入导出流程
┌─────────────────────────────────────────────────────────┐
│ SuperSplat I/O 流程 │
├─────────────────────────────────────────────────────────┤
│ │
│ 导入 │
│ ├── .ply → 解析 COLMAP/3DGS 标准输出 │
│ ├── .splat → 解析 Anti-Martian 紧凑格式 │
│ └── .sog → WebPCodec.wasm 解码 → 高斯数据 │
│ │
│ 导出 │
│ ├── .ply → 标准格式(跨工具交换) │
│ ├── .sog → WebPCodec.wasm 编码(压缩 60-80%) │
│ ├── .png → 截图导出 │
│ └── .svg → 矢量标注导出 │
│ │
│ 特殊 │
│ └── PWA launchQueue → 双击本地 .ply 直接唤起编辑器 │
│ │
└─────────────────────────────────────────────────────────┘
5.4 PWA 文件关联
SuperSplat 支持 PWA(Progressive Web App)集成,注册浏览器的 launchQueue 文件关联。用户双击本地的 .ply 文件,可以直接唤起浏览器中的 SuperSplat 编辑器打开------就像原生桌面应用一样。
六、UI 系统:7 面板 + 时间线 + 多语言
6.1 UI 架构
SuperSplat 采用 PlayCanvas 自家的 PCUI 框架(非 React/Vue),构建了 7 个独立面板:
┌──────────────────────────────────────────────────────────┐
│ SuperSplat UI 布局 │
├────────┬─────────────────────────────────────┬───────────┤
│ │ │ │
│ 工具栏 │ 主 3D 视口 │ 属性面板 │
│ (左侧) │ (WebGL 实时渲染) │ (右侧) │
│ │ │ │
│ │ │ │
├────────┴─────────────────────────────────────┴───────────┤
│ 时间线面板(底部) │
└──────────────────────────────────────────────────────────┘
7 个独立面板:
├── Data Panel # 数据面板(选中高斯的属性编辑)
├── View Panel # 视图面板(相机/显示设置)
├── Timeline Panel # 时间线面板(关键帧动画)
├── Scene Panel # 场景面板(场景树/图层管理)
├── Tools Panel # 工具面板(编辑工具切换)
├── Hierarchy # 层级面板
└── Project # 项目面板
6.2 时间线动画系统
时间线功能:
├── 导入序列 .ply 文件 → 生成帧序列
├── 关键帧记录 → 高斯变换矩阵 + 可见性
├── 相机路径关键帧 → 漫游动画
└── 导出为视频
6.3 多语言支持
| 语言 | 文件 |
|---|---|
| 英语 | en.json |
| 简体中文 | zh-CN.json |
| 日语 | ja.json |
| 韩语 | ko.json |
| 德语 | de.json |
| 西班牙语 | es.json |
| 法语 | fr.json |
| 巴西葡萄牙语 | pt-BR.json |
| 俄语 | ru.json |
切换方式:URL 参数 ?lng=zh-CN
七、性能优化策略:WASM 协处理器 + 渐进加载 + 按需渲染
7.1 三大性能优化手段
┌─────────────────────────────────────────────────────────┐
│ SuperSplat 性能优化架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. WASM 协处理器 │
│ └── @playcanvas/splat-transform │
│ └── 在 WebAssembly 中处理百万级高斯的序列化与排序 │
│ └── 速度远超纯 JavaScript │
│ │
│ 2. 延迟/渐进加载 │
│ └── 异步分批将高斯送入 GPU │
│ └── 避免主线程阻塞,保持 UI 响应 │
│ │
│ 3. 按需渲染 │
│ └── scene.forceRender = true │
│ └── 仅在状态变化时触发渲染 │
│ └── 无操作时不消耗 GPU 资源 │
│ │
└─────────────────────────────────────────────────────────┘
7.2 GPU 设备创建优化
typescript
// 关闭不必要的 GPU 功能
createGraphicsDevice(canvas, {
antialias: false, // α-blending 不需要抗锯齿
depth: false, // α-blending 不需要深度测试
stencil: false // 不需要模板缓冲
})
// 结果:大幅节省 GPU 带宽和显存占用
7.3 场景优化效果参考
| 优化目标 | 实现方法 | 预期效果 |
|---|---|---|
| 减小文件体积 | SOG 压缩导出、移除重复高斯 | ↓50-80% |
| 提升渲染帧率 | 按需渲染、LOD 优化 | ↑2-3× |
| 降低内存占用 | 渐进加载、清理噪点 | ↓30-50% |
八、发布管线:从编辑器到 Web 世界
8.1 三种发布路径
┌─────────────────────────────────────────────────────────┐
│ SuperSplat 发布管线 │
├─────────────────────────────────────────────────────────┤
│ │
│ 路径 1:一键发布到 PlayCanvas CDN(官方推荐) │
│ ├── 菜单 → Publish → To PlayCanvas CDN │
│ ├── 登录 PlayCanvas 账号 │
│ ├── 设置项目名称、是否公开、是否启用流式加载 │
│ └── 获得唯一访问链接,直接分享 │
│ │
│ 路径 2:嵌入自有网站 │
│ ├── 先发布到 PlayCanvas CDN,获取 URL │
│ └── iframe 嵌入代码: │
│ <iframe src="https://playcanvas.com/super-splat/ │
│ viewer/?url=你的场景URL" /> │
│ │
│ 路径 3:社交媒体分享 │
│ ├── 支持 Twitter/X、Reddit 等 │
│ └── 自动生成预览图 + 访问链接 │
│ │
└─────────────────────────────────────────────────────────┘
8.2 查看器三种相机模式
| 模式 | 说明 |
|---|---|
| Orbit(轨道) | 围绕场景中心旋转,适合展示 |
| Fly(飞行) | 自由飞行,适合场景探索 |
| Walk(步行) | 地面行走,适合沉浸式体验 |
8.3 碰撞生成功能(v2.25+ 新增)
最新版本已新增**碰撞网格生成(Collision Generation)**功能,可为 3DGS 场景生成碰撞体------这是将扫描场景直接变成可交互游戏关卡的关键能力。
PlayCanvas 在官方博客中分享了案例《Turning a Gaussian Splat Into a Videogame》:用 SuperSplat 下载扫描场景 → 生成碰撞网格 → 直接在浏览器中做成 FPS 游戏。
九、完整安装部署指南
9.1 在线使用(零配置)
直接访问:https://superspl.at/editor
拖拽 .ply / .splat / .sog 文件到浏览器即可开始编辑
9.2 本地开发部署
bash
# 1. 克隆仓库
git clone https://github.com/playcanvas/supersplat.git
cd supersplat
# 2. 安装依赖(Node.js >= 20.19.0)
npm install
# 3. 启动开发服务器
npm run develop
# 4. 禁用浏览器缓存(重要!)
# Safari: Cmd+Option+E 或 Develop → Empty Caches
# Chrome: Application → Service Workers
# → 勾选 "Update on reload" + "Bypass for network"
# 5. 访问编辑器
# http://localhost:3000
9.3 开发命令速查
| 命令 | 功能 |
|---|---|
npm run develop |
开发模式(watch + serve,推荐) |
npm run develop:auto-launch |
开发模式 + 自动打开浏览器 |
npm run build |
生产构建(Rollup) |
npm run watch |
监听模式,文件变化自动重建 |
npm run serve |
静态文件服务器(端口 3000) |
npm run lint |
ESLint 代码检查 |
十、与传统工具对比
| 特性 | SuperSplat | Blender | Unity/Unreal | InstantNGP |
|---|---|---|---|---|
| 平台 | 浏览器(跨平台) | 桌面应用 | 桌面应用 | 桌面应用 |
| 编辑对象 | Gaussian Splats | Mesh / 粒子 | Mesh + 3DGS 插件 | NeRF / 3DGS |
| 操作门槛 | 低(拖拽为主) | 高(复杂 3D 技能) | 中 | 中 |
| 实时预览 | ✅ 原生 WebGL 60fps | ⚠️ 需插件 | ⚠️ 需插件 | ⚠️ 需 CUDA |
| 安装要求 | 零(浏览器即用) | 需安装 | 需安装 | 需安装 + GPU |
| 开源协议 | ✅ MIT | ✅ GPL | ❌ 商业 | 部分开源 |
| 文件格式 | PLY/SPLAT/SOG | 通用 3D 格式 | 通用 3D 格式 | 自定义 |
| 协作 | 网页链接即分享 | 本地文件 | 本地项目 | 本地文件 |
| 移动端 | ✅ 支持 | ❌ | ❌ | ❌ |
十一、🔥 架构核心原则总结
通过完整拆解 SuperSplat,可以提炼出 6 条架构核心原则:
原则 1:事件驱动,零耦合
所有模块通过中央 Events 事件总线通信,零直接 import 依赖。添加新功能只需监听事件 + 注册工具,无需修改现有代码。
原则 2:异步操作串行化
editQueue 将所有编辑操作排入 EditHistory 队列,彻底避免多异步操作竞争 GPU 状态,保证 Undo/Redo 的确定性。
原则 3:自研格式解决核心痛点
SOG 格式利用 WebP 图像压缩,体积比 PLY 缩小 60-80%。不依赖第三方格式,自己掌握核心数据链路。
原则 4:WASM 协处理器处理重计算
百万级高斯的序列化、排序、编解码全部在 WebAssembly 中完成,速度远超纯 JavaScript,不阻塞主线程。
原则 5:按需渲染节省 GPU 资源
scene.forceRender = true 标记机制,仅在状态变化时触发渲染。无操作时不消耗 GPU 资源。
原则 6:Engine Agnostic(引擎无关)
虽然基于 PlayCanvas 引擎构建,但导出的 PLY/SPLAT 文件可以被 Unity、Unreal、Three.js 等任意引擎消费。编辑器不绑定渲染引擎。
十二、开发检查清单
如果你想基于 SuperSplat 的模式构建自己的 3D 编辑器或 Web 3D 工具,参考以下清单:
- 事件驱动架构:中央 Events 总线 + 模块间零直接依赖
- 异步操作队列:editQueue + EditHistory 串行化
- 自定义着色器体系:针对特定渲染管线(非标准光栅化)的专用 Shader
- GPU 读回规避:使用 2D Canvas 做选区运算,避免 GPU→CPU 回读瓶颈
- WASM 协处理器:重计算任务放到 WebAssembly 中
- 自研优化格式:针对特定数据的压缩编码方案
- 按需渲染:脏标记 + 仅在状态变化时触发 GPU 渲染
- 渐进加载:异步分批加载数据到 GPU
- PWA 集成:launchQueue 文件关联 + Service Worker 缓存
- 多语言框架:i18next + URL 参数切换
- 统一工具接口:ITool 接口 + ToolManager 注册
- 关闭不必要的 GPU 功能:antialias/depth/stencil 按需开关
十三、技术演进方向
13.1 已实现
- ✅ 145+ 版本迭代(平均 3-4 天一版)
- ✅ 12 种自定义着色器
- ✅ 11 个编辑工具
- ✅ SOG 自研压缩格式(WebP 编解码)
- ✅ 碰撞网格生成(v2.25+)
- ✅ 时间线动画系统
- ✅ 一键发布到 PlayCanvas CDN
13.2 进行中
- 🔄 WebGPU 支持(利用 Compute Shader 在 GPU 端直接排序,解决 CPU 排序瓶颈)
- 🔄 流式加载(结合视锥体裁剪,突破内存限制)
- 🔄 协作编辑(基于事件同步 + 操作压缩架构)
13.3 未来展望
- 🔮 城市级大场景支持(1 亿+ 高斯)
- 🔮 多人实时浏览器协同编辑
- 🔮 AI 辅助编辑(自动清理噪点、智能补全缺失区域)
十四、总结
| 维度 | 评价 |
|---|---|
| 技术深度 | ⭐⭐⭐⭐⭐ 12 种自定义着色器、WASM 协处理器、事件驱动架构 |
| 工程质量 | ⭐⭐⭐⭐⭐ 145+ 版本、严格模块化、纯 TypeScript |
| 生态价值 | ⭐⭐⭐⭐⭐ 填补 3DGS 编辑空白、引擎无关、MIT 协议 |
| 用户体验 | ⭐⭐⭐⭐⭐ 浏览器即用、零安装、9 种语言 |
| 创新性 | ⭐⭐⭐⭐☆ SOG 格式、碰撞生成、PWA 文件关联 |
一句话总结:SuperSplat 不只是一个编辑器------它是 3D Gaussian Splatting 从「实验室技术」走向「生产级内容工作流」的关键桥梁。
资源汇总
下期预告:深度拆解一个来自顶尖 AI 实验室的开源项目------敬请期待!
💬 讨论:你觉得 3D Gaussian Splatting 会取代传统 3D 建模吗?SuperSplat 的浏览器端架构是否适合你的三维内容工作流?欢迎在评论区分享你的看法。
本文基于 SuperSplat 仓库(v2.26.1,2026 年 5 月 17 日)及多个第三方技术分析整理,所有技术细节均经过交叉验证。如发现任何不准确之处,欢迎指正。