GLB 格式
GLB(二进制 glTF)可通过 Khronos KHR_gaussian_splatting 扩展保存高斯泼溅,使其进入标准 glTF 管线,并与普通网格、材质和动画共存于单文件。
可用 SplatTransform 创建,直接由 PlayCanvas 加载。
存储方式
扩展将场景存为 POINTS 拓扑的 glTF 网格图元,各属性作为顶点属性:
| 属性 | 类型 | 内容 |
|---|---|---|
POSITION | VEC3 | 中心位置 |
KHR_gaussian_splatting:ROTATION | VEC4 | xyzw 旋转四元数 |
KHR_gaussian_splatting:SCALE | VEC3 | 各轴线性空间尺寸 |
KHR_gaussian_splatting:OPACITY | SCALAR | 已应用 sigmoid 的不透明度 |
KHR_gaussian_splatting:SH_DEGREE_{d}_COEF_{n} | VEC3 | 球谐系数,每个系数包含 RGB |
COLOR_0 | VEC4 | 不支持高斯泼溅的查看器使用的可选回退颜色 |
与 PLY 的差异:
- 激活后数值:缩放为线性空间,PLY 为对数;不透明度已过 sigmoid,PLY 为变换前值。
- 坐标系:标准 glTF 的 +Y 向上,不像 PLY 那样需要翻转旋转。
- 回退渲染:不理解扩展的查看器仍可绘制 COLOR_0 点云。
创建 GLB
用 SplatTransform 转换任意受支持格式:
splat-transform scene.ply scene.glb
在 PlayCanvas 中加载
与其他 glTF 一样,GLB 以 container 资源加载,而非 gsplat:
const asset = new pc.Asset('scene', 'container', { url: 'scene.glb' });
app.assets.add(asset);
app.assets.load(asset);
asset.ready(() => {
// creates an entity hierarchy with gsplat components
const entity = asset.resource.instantiateRenderEntity();
app.root.addChild(entity);
});
容器通过 asset.resource.gsplats 暴露从属 gsplat 资源,与渲染资源和材质类似。应用必须注册 GSplatComponentSystem。
引擎支持说明
- 仅支持标准高斯泼溅的 ellipse 核,其他核按 ellipse 渲染,调试构建会警告。
- 忽略 sortingMethod 和 projection,排序由全局 gsplat 设置控制。
- 不支持仍处草案的
KHR_gaussian_splatting_compression_spz_2压缩扩展。
何时使用 GLB
GLB 未压缩,体积接近 PLY,适合标准 glTF 管线或与网格合并为单资源。
提示
Web 交付仍推荐 SOG,可压缩 15–20 倍,加载更快。