跳转至

Point Cloud 模块

Point Cloud(点云)模块将归一化的高斯 Splat 数据转换为 GPU 资源,从而为 Visionary 的预处理、排序和渲染管线提供动力。它封装了缓冲区创建、绑定组连接、运行时参数调整以及动态 ONNX 驱动的动画,因此系统的其余部分可以专注于算法而不是底层连接。

概览

该模块提供:

  • GPU 缓冲区编排 – 上传 CPU 数据或接受预创建的 GPU 缓冲区,并分配用于预处理、排序和间接绘制的投影 2D Splat 缓冲区。
  • Uniform 与元数据流 – 维护绘制级 Uniform 以及一个 128 字节的模型参数块,其中携带 WGSL 着色器可理解的变换、Splat 控制参数和精度元数据。
  • 绑定组管理 – 提供缓存的计算和渲染绑定组布局,以及自动实例化的绑定组,以匹配预处理 (@group(0)) 和渲染阶段的预期。
  • 运行时控制 – 暴露高斯缩放、球谐函数阶数、内核大小、不透明度、截止阈值和渲染模式的设置器,使工具无需触碰着色器即可调整外观。
  • 动态数据路径DynamicPointCloud 将基础设施与 ONNX 生成器、可选的绘制计数缓冲区以及时间轴控制器配对,以驱动实时内容。

职责

GPU 数据生命周期

  • 接受来自 IO 模块的 GenericGaussianPointCloudTSGaussianDataSource 的别名)对象。
  • 将高斯属性和 SH 系数上传到专用的 GPUBuffer 对象中,或复用外部生成的缓冲区以实现零拷贝工作流。
  • 使用 BUFFER_CONFIG.SPLAT_STRIDE(32 字节)中定义的步幅分配投影 Splat 缓冲区,以便计算着色器可以发出屏幕空间记录加上间接绘制负载。

Uniform 与绑定组连接

  • 通过 UniformBuffer 初始化绘制 Uniform ([numPoints, shDegree, 0, 0])。
  • 用变换、偏移、着色旋钮和精度描述符填充模型参数 Uniform,然后发布辅助方法(updateModelParamsBuffer, setTransform, 参数设置器)以使其与场景状态保持同步。
  • 提供与 layouts.ts 中缓存布局相匹配的 bindGroup()renderBindGroup() 句柄,保证跨管线的一致性。

动态与感知精度的渲染

  • 允许通过 replaceStorageBuffers 进行运行时缓冲区交换,实现 FP32→FP16 或量化转换而无需重建对象。
  • DynamicPointCloud 通过 ONNX 生成器挂钩、精度元数据注入(setPrecisionForShader, applyFP16)、用于间接绘制的可选计数缓冲区以及管理播放、循环和时间缩放的 TimelineController 来增强基类。

核心组件

  • PointCloud (point_cloud.ts) – 拥有静态数据集的 GPU 缓冲区、Uniform 和绑定组的核心类。
  • DynamicPointCloud (dynamic_point_cloud.ts) – 扩展 PointCloud,具有直接 GPU 缓冲区摄入、ONNX 生成器集成和高级时间轴控制。
  • layouts.ts – 暴露 getBindGroupLayoutgetRenderBindGroupLayoutBUFFER_CONFIG;所有布局均按 GPUDevice 缓存。
  • splat_buffer.ts – 定义 SplatBufferGenericGaussianPointCloud 和镜像 GPU 内存布局的辅助类。
  • index.ts – Visionary 其余部分使用的统一导出文件。

缓冲区与布局快照

缓冲区 来源 用途标志 内容
高斯存储 CPU 上传或外部 GPU 缓冲区 STORAGE | COPY_DST 打包的位置、不透明度和协方差(每个 Splat 10× f16)。
SH 存储 CPU 上传或外部 GPU 缓冲区 STORAGE | COPY_DST 打包的球谐函数系数(依赖于阶数)。
2D Splat 缓冲区 每个点云分配 STORAGE | COPY_SRC | COPY_DST | INDIRECT 屏幕空间 Splat 负载加上排序键(步幅 = 32 字节)。
绘制 Uniform 每个点云分配 UNIFORM | COPY_DST 预处理内核使用的 [numPoints, shDegree, …]
模型参数 每个点云分配 UNIFORM | COPY_DST 128 字节块,包含变换、偏移、着色旋钮和精度元数据。

模型参数布局 (128 字节)

字节范围 字段
0 – 63 4×4 变换矩阵(列主序)。
64 – 67 预处理器打包多个点云时使用的 baseOffset
68 – 71 着色器用的 numPoints 镜像。
72 – 75 gaussianScaling (高斯缩放)。
76 – 79 maxShDeg (最大 SH 阶数)。
80 – 83 kernelSize (内核大小)。
84 – 87 opacityScale (不透明度缩放)。
88 – 91 cutoffScale (截止缩放)。
92 – 95 rendermode (渲染模式)。
96 – 99 gaussDataType (0=f32, 1=f16, 2=i8, 3=u8)。
100 – 103 colorDataType
104 – 107 gaussScale (用于量化解码)。
108 – 111 gaussZeroPoint
112 – 115 colorScale
116 – 119 colorZeroPoint
120 – 127 保留/填充以供未来元数据使用。

使用模式

import { PointCloud } from 'src/point_cloud';

const gaussianData = await defaultLoader.loadFile(file); // IO 模块
const pc = new PointCloud(device, gaussianData);

pc.updateModelParamsBuffer(modelMatrix);
pc.setGaussianScaling(1.2);

computePass.setBindGroup(0, pc.bindGroup());
renderPass.setBindGroup(0, pc.renderBindGroup());

对于动态源:

import { DynamicPointCloud } from 'src/point_cloud';

const dpc = new DynamicPointCloud(device, gaussianGPU, shGPU, maxPoints, countBuffer, 48, precisionInfo);
dpc.setOnnxGenerator(onnxGenerator);
dpc.setTimeUpdateMode(TimeUpdateMode.VARIABLE_DELTA);
await dpc.update(cameraMatrix, modelMatrix, performance.now());

集成点

  • IO 模块 – 提供构造函数使用的 GenericGaussianPointCloudTS 实例。
  • Preprocess (预处理) 模块 – 使用 bindGroup() 读取高斯/SH 数据并写入投影 Splat。
  • Sort (排序) 模块 – 消费共享的 2D Splat 缓冲区和间接绘制元数据。
  • Renderer (渲染器) 模块 – 使用 renderBindGroup() 对投影 Splat 进行采样。
  • App/Managers – 调整运行时参数(缩放、内核大小、渲染模式)并在变换更改时触发 updateModelParamsBuffer()
  • ONNX/Tensor 路径 – 将 GPU 缓冲区及精度元数据馈送给 DynamicPointCloud

文件结构

src/point_cloud/
├── index.ts                # 统一导出
├── point_cloud.ts          # PointCloud 类
├── dynamic_point_cloud.ts  # DynamicPointCloud 子类
├── layouts.ts              # 绑定组布局 + 缓冲区配置
└── splat_buffer.ts         # 镜像 GPU 内存布局的接口

相关文档

  • 架构 – 缓冲区布局、绑定组设计和 GPU 内存编排。
  • API 参考手册 – 构造函数签名、更新钩子和动态时间轴标志。
  • 预处理模块 – 展示 Splat 数据如何在排序前被投影。
  • 排序模块 – 解释投影 Splat 如何为渲染进行排序。
  • 渲染器模块 – 详述共享缓冲区如何为最终绘制调用提供数据。