2026年4月14日“AI教母”李飞飞的世界实验室团队开源了动态3D高斯斑点(3DGS)渲染器Spark 2.0。我们对 Spark 2.0 的 3D 高斯喷射流式细节层次进行系统的深入剖析。
在网络上流式传输 3DGS 世界
Spark是一款专为 Web 构建的动态 3D 高斯喷溅 (3DGS) 渲染器。它与 Web 上最流行的 3D 框架THREE.js集成,并使用WebGL2在任何带有 Web 浏览器的设备上运行,包括桌面、iOS、Android 和VR 设备。
Spark 于去年推出,带来了许多其他渲染器所不具备的功能:在同一场景中渲染多个 3DGS 对象、实时编辑和重新照明,以及允许用户创建完全动态的基于 splat 的效果和动画的着色器图系统。
Spark 2.0 新增了细节层次 (LoD) 系统,可在任何设备上流畅播放和渲染大型 3DGS 世界。当您在世界中移动时,Spark 会自动根据视角优化 3DGS 细节层次,并通过互联网传输必要的数据。
本文将深入探讨实现这一目标的技术细节,并在此过程中学习一些计算机图形学和系统工程知识。如果您已经熟悉 3DGS,可以直接跳过介绍,阅读 Spark 2.0 LoD 方法部分。
3D高斯散射
随着机器学习技术的出现,利用摄影测量技术对世界进行扫描并将其转换为计算机上的三维数据这一技术发展迅速。三维高斯散射技术的引入 使得在消费级设备上交互式渲染这些扫描结果成为可能。
在传统的3D图形中,我们使用纹理映射的三角形来表示物体的表面。但在3DGS中,我们则使用数百万个被称为“斑点” 的半透明彩色椭球体,它们混合在一起形成所有表面和微小细节。
点击以 3D 方式查看: 使用纹理映射三角形网格(左)和高斯斑点(右)渲染同一对象 (https://wlt-ai-cdn.art/spark-2.0/260413/tri-vs-splat.html)。
每个碎片都具有以下属性:其在空间中的中心位置椭球体XYZ轴的半径三维方向RGB颜色及其不透明度如果我们忽略方向,并将飞溅物置于原点,我们可以用以下函数描述其三维“密度”。具有高斯分布。
点击即可进行 3D 交互: 调整控制 3D 高斯斑点外观的属性:中心、XYZ 缩放、旋转、不透明度和颜色 (https://wlt-ai-cdn.art/spark-2.0/260413/3dgs-props.html)。
将这些飞溅物渲染到屏幕上最常见的方法是使用画家算法,我们将飞溅物从后往前排序,然后将它们彼此叠加绘制,并使用“over”运算符将半透明区域混合在一起。每个 3D 椭球体都被投影到图像平面上,近似为 2D 椭圆,对于椭圆中的每个像素,我们根据其高斯分布计算不透明度,最后混合其颜色。加上之前画好的泼溅图案。
Spark的起源
Spark 最初是 World Labs 开发的内部 3DGS 渲染器,因为当时的 Web 渲染器存在一些缺陷,会限制我们未来的发展。例如,它们一次只能正确渲染一个 3DGS 对象,无法动态渲染飞溅效果(俗称“4DGS”),它们基于不太流行的 3D 框架,或者使用了并非所有设备都支持的WebGPU。这款渲染器曾在我们 2024 年大型世界模型研究预览和早期世界展示Lofi Worlds中亮相。
点击体验 3D 版《 Lofi Worlds》:一段由 Marble 打造的轻松惬意的 3D 世界之旅。在 Quest 3 或 Apple Vision Pro 上使用 VR 设备体验效果最佳 https://lofiworlds.ai/marble/。
但我们希望任何人都能构建交互式 3DGS Web 体验,因此我们决定运用我们的经验,构建一个通用的开源 3DGS 渲染器。我们选择基于 Web 上最流行的 3D 框架THREE.js来构建它,该框架即使在使用 Vibe 编码的情况下,也能在浏览器中创建复杂的 3D 体验。此外,我们还以WebGL2为目标,它是目前几乎可以保证在所有设备上运行的唯一 3D Web API 。
Spark 与Marble同步开发,Marble 允许用户使用我们的多模态世界模型在 Web 浏览器中创建 3D 世界。Marble 提供了一个具体的用例,帮助 Spark 成长为一个灵活、用户可编程的 3DGS 处理引擎,同时也展示了 Spark 的强大功能。
Spark系统设计
我们希望能够通过将 3DGS 对象连接在一起来构建庞大的世界,而要正确地实现这一点,必须将不同对象上的所有碎片按照统一的从后到前的顺序进行排序。否则,仅进行局部排序的对象看起来就像是彼此“粘贴”在一起,而不是共存于同一个 3D 空间中。
点击体验 3D 效果: 局部错误排序与全局排序的对比 https://wlt-ai-cdn.art/spark-2.0/260413/bad-sorting.html
3DGS 也是一个快速发展的领域,我们希望用户能够尝试新的灯光调整、动画、实时编辑或其他创意/交互效果技术。我们希望 Spark 足够灵活,能够处理这些用例,而无需不断修改 Spark 的核心系统。
Spark 使用三步算法来解决这些问题:
从所有 3DGS 对象中生成一个全局的 splat 列表,并将这些对象转换到同一空间。 按照当前视图,将此全局列表从后往前排序 按此顺序渲染飞溅物
1. 生成全局 splat 列表
步骤 1 遍历每个 3DGS 对象,并将其碎片添加到全局列表中。由于每个 3DGS 对象在空间中的位置和方向都可以独立调整,因此我们至少需要将这些碎片转换到同一坐标系中。
点击体验 3D: Spark 通过 3 个步骤渲染动态、正确排序的 3D 高斯飞溅:1) 为当前帧生成动画飞溅的全局列表,2) 将飞溅从后往前排序,3) 将飞溅从后往前渲染 https://wlt-ai-cdn.art/spark-2.0/260413/render-steps.html。
Spark 利用这一机会,在 GPU 上的每个 splat 对象上运行可定制的数据管道。这开启了各种可能性:重新着色、调整不透明度、基于 SDF 的裁剪、动画过渡、在扫描的 4DGS 帧之间进行插值等等。该管道可由用户编程,既可以使用GLSL,也可以通过将节点连接成计算图(类似于 3D 引擎中的着色器图系统)。每个 3DGS 对象都可以运行自己的管道,在场景中混合搭配各种效果。
2. 对飞溅物进行分类
尽管步骤 2 中的排序在现代 GPU 上是可行的,但 WebGL2 提供的编程模型使得这样做成本过高。因此,Spark 会在 GPU 上计算 splat 距离,并将该列表读回 CPU。然后,这些距离会在后台Web Worker线程中使用两遍基数排序进行排序。Spark 进一步扩展了这一过程,允许您同时处理多个视点,每个视点都可以拥有自己的排序顺序。
3. 渲染飞溅物
一旦我们获得了所有斑点及其顺序的全局列表,在步骤 3 中,我们会执行一次绘制调用,一次性绘制所有斑点。每个斑点都被渲染成一个定向四边形(实际上是两个三角形),包围着斑点投影的二维椭圆。四个顶点通过自定义顶点着色器计算,然后片段着色器通过计算高斯分布来计算每个像素的不透明度,最后 GPU 硬件将颜色混合到帧缓冲区中。
扩展到庞大的世界
自 Spark 最初推出以来,3DGS 的受欢迎程度和规模都在不断增长。如今,3D 扫描通常包含数千万个像素点,而 World Labs 正在生成更大、更优质的世界,这些世界可以扩展并组合成巨大的 迷宫。
然而,大多数消费级设备只能以交互式帧速率渲染 100 万到 500 万个像素点。大型场景需要下载 100 MB 甚至 1 GB 以上的 3DGS 数据才能显示。移动设备浏览器对 GPU 内存利用率有限制,这限制了可以可靠地在线共享的世界的大小。
Spark 2.0
全新的 Spark 2.0 是一个完整的解决方案,可在各种设备上通过网络 **准备、流式传输和渲染大型 3DGS 场景**。
它采用了三种图形和系统技术来应对扩展性挑战:
细节层次: 准备低分辨率的飞溅物模型,并计算出哪些飞溅物子集需要渲染才能满足摄像机视角。通过减少距离过远而无法辨认细节的飞溅物数量,我们可以提高渲染性能。 渐进式流: 随着数据下载,以由粗到精的方式加载 3DGS 细节,优先加载能够最好地解析细节的数据,具体取决于摄像机的朝向。 虚拟内存:为splat 页表分配一个固定的 GPU 内存池,该页表会根据我们在场景中的位置自动换入和换出 3DGS 数据块,从而可以访问通过互联网获取的多个 3DGS 对象中的大量 splat 数据池。
细节层次
在计算机图形学中,处理大型 3D 场景的常用技术是使用细节层次 (LoD)系统,该系统会根据与观看者的距离自动调整渲染的细节量。为了提高帧速率,可以降低细节;当观看者停止移动时,则可以提高细节。
LoD 的一个经典例子是Mipmap,它将纹理降采样成一个由更小纹理组成的金字塔,每个纹理层的大小是前一个纹理层的一半,最顶层只有一个像素。这使得我们能够快速采样出一个与屏幕像素大小大致相同的纹理像素,无论距离摄像机多远。
虚幻引擎的Nanite是现代知名的三角形网格 LOD 系统,它创建不同细节级别的三角形簇层次结构,并根据视角选择一部分簇以合适的细节级别进行渲染。

左图: 使用 Mipmap 技术实现纹理 LOD,采用低分辨率纹理金字塔结构。右图: 使用 Nanite 技术实现网格 LOD,采用三角形簇层级结构,允许选择具有合适细节的网格。
不同的细节层次(LoD)方法存在于从离散到连续的一系列LoD方法中。离散LoD方法涉及创建几个不同数量的飞溅物版本,从少量到大量飞溅物,然后根据它们近似边界与相机之间的距离在这些版本之间切换。
虽然 Spark 的原始系统设计本身就支持这种模型,但这种方法会导致在移动和突然切换版本时出现“弹出”的瑕疵,并且在将 splat 分组到图块中时会出现可见的边界。
细节层次高斯树
Spark 的 LoD 设计是一种连续的 LoD方法,其中所有 splat 都存在于一个层级结构中,即LoD splat 树。Spark 会沿着树的边界切割线单独选择 splat,以优化视口内的 splat 细节。
每个内部树节点都是其子节点的低分辨率版本,由多个小球合并而成,新小球的形状和颜色近似于子小球。这种合并一直向上延伸到树的根节点,根节点是一个大的单球,其形状和颜色是对象中所有小球的聚合结果。

左图: 通过将输入的叶子节点合并成更大的内部节点,直至单个根节点,生成的LoD树。右图: Spark计算树的切割,根据当前视角选择要渲染的节点。
利用这个 LOD splat 树,Spark 计算出其中的“切片”,从而选择最佳的数据集。要为当前视口渲染的 splats。通过设置最大 splat 预算。(根据设备类型,渲染 50 万到 250 万个水滴)我们确保每帧只需渲染固定数量的水滴,从而实现稳定、高帧率。通过调整我们可以权衡帧率和画面细节之间的利弊。
点击体验 3D: Spark 会根据相机视锥体不断调整 3DGS 细节级别,并根据需要通过互联网传输数据块(以绿色闪烁显示)。
LoD splat 树遍历
Spark 通过遍历 splat 树来计算出最适合视点的 LOD splat 子集,以便进行渲染。时间,在哪里这是渲染的 splat 预算,与 splat 树的总大小无关。无论场景中全局有多少 splat,Spark 都会以大致相同的时间更新细粒度的 splat LOD。树遍历算法使用优先级队列:
从 LoD splat 根开始计算其屏幕尺寸并插入进入优先级队列。 弹出最大尺寸的LoD碎片从优先级队列中。如果小于 1 像素或如果是叶节点,则将其添加到输出集中,并重复步骤 2。 如果用其子级元素替换 LoD 元素会超出元素预算,那就太可惜了。将所有剩余的队列 splat 移到输出集,并停止算法。 否则,对于每个孩子父母计算屏幕尺寸并插入加入队列。最后,重复步骤 2。
点击即可在 3D 中交互: Spark 从粗到细遍历 LoD splat 树,计算出一个树切割,在N 个splat的预算内平衡 splat 像素大小。https://wlt-ai-cdn.art/spark-2.0/260413/lod-traversal.html
Spark 用Rust编写了该算法,并将其编译为WebAssembly (Wasm),以便在后台 Web Worker 中高效运行,从而使 LoD 更新异步运行,不会影响主渲染循环。
复合 LOD 飞溅场景
Spark 通过同时遍历多个 LoD splat 树实例,进一步推广了该算法。它不是从单个根节点开始,而是针对每个 3DGS 对象进行遍历。我们插入它的屏幕尺寸和 splat 节点进入初始优先级队列。算法的其余部分与之前相同,同时选择场景中所有 3DGS 对象中需要细化的细节。
这样,我们只需在空间中的任何位置添加 3DGS LoD 对象,即可轻松创建庞大的复合世界,Spark 将计算所有 LoD splat 的最佳全局子集来渲染每一帧。
点击体验 3D 效果: 由多个 3DGS 对象创建的复合世界,每个对象都有一个 LOD 细节层次树。Spark 同时遍历这些对象,生成统一的细节层次渲染图。https://wlt-ai-cdn.art/spark-2.0/260413/multi-lod.html
中心凹斑点
Spark 采用了固定注视点渲染技术,将 LOD 细节分布的预算偏向于视线方向的中心。这提高了视线方向上的细节层次,同时将较少但更大的 LOD 细节分布分配给视线两侧和后方。
由于 Spark 会计算 LoD 飞溅屏幕尺寸作为LoD树遍历的一部分,为了首先细化最粗糙的碎片,我们可以进行调整为了精确控制整个世界的细节层次。如果我们把飞溅区域扩大一倍……它将被插入到优先级更高的队列中,并解析成两倍更精细的细节。相反,如果我们把 splat 的大小减半到它的优先级会更低,并且会解析成 2 倍粗略的 splats。
我们将这个缩放因子称为注视尺度。这会随着溅射视角方向的变化而变化调整计算结果到最终得到的相对飞溅尺寸为。
Spark 使用四个 LoD 参数来控制与视图相关的细节级别:
coneFov0:围绕视线方向的圆锥体的角度以及全分辨率。 coneFov :一个较大圆锥体的角度,其细节将因coneFoveate而减少。 coneFoveate :视锥细胞视野边缘的注视点尺度,平滑插值当角度从coneFov变为coneFov0时,将其设置为结果是飞溅物体积增大了10倍。 后注视点:相机后方的注视点范围,平滑变化从锥形视场角到180度。
点击即可进行 3D 交互: Spark 的 LoD 系统使用注视点渲染将飞溅细节集中在摄像机注视的位置。https://wlt-ai-cdn.art/spark-2.0/260413/foveation.html
生成LoD树
Spark 可以使用其命令行工具build-lod将任何 3DGS 文件转换为编码在新的可流式 .RAD 文件中的 LoD splat 树。或者,它也可以加载 Web 浏览器中的任何文件,并使用后台 Web Worker 按需创建 LoD 树。这两种方法都运行相同的 Rust 代码,该代码可以编译为 Wasm 和原生环境。
Spark 2.0 包含两种用于创建 LoD splat 树的算法:1) 一种快速紧凑的算法,称为Tiny-LoD, 在 Web 上运行时默认使用;2) 一种更高质量的Bhatt-LoD, 在命令行上默认使用。
这两种方法都是“无需训练”的,不需要任何参考图像或其他输入,而是直接处理3DGS数据。此外,还可以使用其他树生成方法,例如,可以使用NanoGS生成LoD树。
微型LoD算法
这种方法旨在按需使用,其首要目标是在不占用过多内存的情况下快速生成合理的LoD(细节层次)分支树。它基于我们之前称为Quick-LoD的体素八叉树算法,但采用了来自计算基因组学的内存优化技术。
我们将空间划分成立方体网格,并允许该网格的步长变化。, 在哪里是一个对应于 LoD 树级别的有符号整数,是相邻网格尺寸之间的比率。当这对应于一个普通的八叉树,一种图形学中常用的三维数据结构。每个输入的splat都会以一定位置插入到网格中。它的尺寸略小于立方体网格的尺寸。我们将每一块碎片放置在包含其中心的立方体中。
我们处理一个一次从最低处开始包含最小的碎片。对于当前每个立方体网格如果一个立方体包含多个碎片,则将这些碎片合并成一个新的碎片。创建一个对应的 LOD 树节点,并将之前的碎片作为子节点。处理完所有立方体后,递增 。并重复此过程。此过程持续进行,直到所有输入 splat 都合并成一个根 splat 为止。

点击体验 3D: Tiny-LoD 通过合并落入网格立方体内的 splat 来生成 LoD splat 树,向上迭代更大的网格层次结构,直到所有 splat 合并成一个根。https://wlt-ai-cdn.art/spark-2.0/260413/tiny-lod.html
在计算基因组学中,经常需要找到包含相同子串的数据。字母。这可以用哈希表轻松实现,但当键空间很大且值为可变大小的数组时,由于数据结构开销,内存和缓存效率会降低。Tiny-LoD 借鉴了计算基因组学中的一种技巧来高效地完成这项工作:
不要使用哈希表,而是创建一个连续的数组对于我们插入的每个 splat,其中。 按以下方式对数组进行排序之后所有溅射都具有相同的将在数组中相邻。尽管排序是通常情况下,这种方法比哈希更快,因为它具有更好的缓存局部性。 遍历网格单元格,将数组从头到尾分成若干组具有相同属性的 splat。。 将这些碎片组合并成新的 LOD 碎片。 在下一个更大的尺寸上重复步骤 1。。
虽然看起来这似乎是一个很自然的选择,其中 splat 会递归地合并到常规的 2 的幂次方八叉树中,但在实践中我们发现产生更令人满意的结果。使用非整数不规则的网格边界会随着层数的增加而打破图案,并减少飞溅细节的大幅变化。较小的底座,例如可以实现更平滑的细节过渡,但也会导致树状结构更高,遍历和更新速度更慢。默认情况下,Tiny-LoD 使用为了平衡这些因素。
Bhatt-LoD算法
此方法以Bhattacharyya和Bhattacharyya 距离命名,用于计算两个 3DGS 形状之间的统计重叠度。与 Tiny-LoD 类似,它从下到上合并 splat,但选择要合并的 splat 对是基于它们的形状和颜色的相似程度。它适用于“离线”使用,在这种使用场景下,我们优先考虑质量而非速度。
Bhatt-LoD 遍历所有输入的 splat,这些 splat 被组织成一个优先级队列,从最小的 splat 开始,一直到最大的 splat。对于每个 splat它会在溅落物周围搜索其他大小相似的溅落物。并计算一个指标它会选择相似度最高的 splat(如果存在),并将两个 splat 合并成一个新的 splat,然后将其插入队列。此过程持续进行,直到优先级队列中只剩下一个 splat,该 splat 即为根 splat。
比较飞溅物和我们定义形状相似性由以下方式捕捉:其中,Bhattacharyya 距离表示两个三维高斯密度函数之间的距离。颜色相似度通过以下方式计算:它们颜色之间的平方差。
因为 Bhatt-LoD 总是合并成对的 splat,如果我们从输入 splats,我们最终将得到完全相同的结果最终树状图中的 LOD 碎片。为了简化树状图,我们修剪掉所有至少比其子项大数倍。默认情况下,对于 Bhatt-LoD,我们使用这使得生成的 LoD splat 树比原始输入 splat 大约大 30-40%。
渐进式流媒体
Spark 2.0 定义了一种新的文件格式 .RAD(代表 RADiance 场),它压缩 3DGS 数据,并支持随机访问流式传输,以便在数据通过互联网传输时进行渐进式细化。3DGS 对象几乎立即显示为所有 splat 的粗略 64K splat 近似值。数据块被提取出来,首先用于细化最粗糙的可见 LoD splat,并随着观察者在场景中移动而重新调整优先级。

现有 3DGS 文件格式存在问题
3DGS 数据最常见的两种文件格式是原始的.PLY和.SPZ,它们代表两种不同的数据编码方式:面向行和面向列:
.PLY:在纯文本头部之后,存储 splat 0 的所有属性,然后是 splat 1 的所有属性,依此类推,称为行顺序。每个值都编码为 float32 类型,不进行任何压缩。包含 SH0 到 3 的 1000 万个 splat 可能消耗高达 2.3 GB 的数据。 .SPZ :按列顺序编码数据,首先存储所有 splat 的中心坐标,然后存储所有 splat 的不透明度,依此类推。每个属性都以更少的比特位存储,精度也相应降低,例如,不透明度 0 到 1 被编码为 0 到 255,占用一个字节。所有列连接起来并压缩为 GZ 流。1000 万个 splat,如果包含 SH0 到 3,则数据量仅为 200-250 MB。
由于 .PLY 文件按行顺序存储,我们可以通过在接收到数据后立即显示 splat 来逐步加载数据。但它未压缩,编码精度也较低。.SPZ 文件按列顺序存储相似类型的数据,从而实现更高的压缩率。但遗憾的是,它无法逐步加载,因为必须先接收到整个文件,才能显示包含所有属性的 splat。
.RAD 文件
为了实现我们为 3DGS 开发一种压缩、高效、可流式传输格式的目标,我们开发了一种新的文件格式 .RAD。我们的目标是使其易于编码/解码、可扩展、具有可选择的编码精度并允许随机访问。

RAD 文件结构由可扩展的 JSON 元数据头和可随机查找的数据块组成。每个数据块都是一个 RADC 文件,包含 JSON 头以及 64K 数据块的属性,这些数据块按列顺序编码和压缩。
文件结构很简单:头部RAD0、头部元数据的字节大小、元数据 JSON,以及一个或多个 64K 的数据块。头部元数据包含所有数据块的偏移量和字节大小,这使得我们可以按任意顺序获取数据块。
每个数据块本身都采用类似的格式:一个头部RADC,数据块头部元数据的大小,元数据 JSON,以及 64K splat 的压缩数据。splat 属性按列顺序存储,每个属性的编码方式均可自定义。每个属性都使用 Gzip 压缩,由于相似的数据类型存储在一起,因此压缩效果良好。
由于标头采用 JSON 编码,因此可以通过使用该version字段并添加新的可选字段来确保未来的可扩展性。数据类型编码和压缩算法是根据元数据中的字符串名称选择的,从而允许将来添加新的字符串。
空间划分LoD树
可以将LoD模型树视为存在于四个维度上:三个空间维度和一个细节层次维度。为了使用流式处理进行渐进式细化,我们需要在.RAD文件中将LoD模型仔细地组织成块。
这里有很多可行的策略,但Spark的方法旨在通过将空间递归地细分为更小的区域,使splat数据在空间上共存。64K大小的数据块从大到小依次填充这些空间区域中的splat数据,并在每个数据块内尽可能地解析出更多细节。
第一个数据块没有空间边界,从索引为 0 的根 splat 开始,然后是它的子 splat,再是子 splat 的子 splat,按大小递减的顺序排列,直到达到 64K 个 splat。然后,我们将空间细分为AABB区域,并递归遍历每个区域,在区域内添加 splat,直到它们填满一个 64K 的数据块。这些区域被进一步细分,如此循环往复,直到所有 splat 都被输出到一个数据块中。

点击即可进行 3D 交互: Spark LoD 树被分割成空间上共位的块,并在 64K 个 splat 中尽可能地解析细节。https://wlt-ai-cdn.art/spark-2.0/260413/lod-chunking.html
采用这种策略,首先加载的 64K 数据块是树状结构中最大的 64K 数据块,从而可以几乎立即渲染出粗略版本的数据块。之后加载的每个 64K 数据块都会在空间细分区域内提供尽可能多的细节。这样,我们就可以获取与观察者附近区域对应的数据块,并快速解析细节。
遍历缺失区块的LoD树
Spark 通过加载整个数据块来处理 .RAD 文件,但数据块 0 之后的加载顺序可能取决于哪些数据块最能清晰地展现视口中的细节。通过跟踪每个数据块是否已加载,LoD 遍历算法可以快速判断一个 splat 的子元素是否已加载。如果子元素尚未加载,则先渲染父 splat,等待接收到数据后再进行进一步的细化。
在遍历 LoD splat 树时,Spark 会维护一个已访问区块及其顺序的列表,其中包含尚未加载的区块。由于遍历算法会按照屏幕尺寸从大到小的顺序对 splat 进行细化,因此列表中较早的区块包含的 splat 比后访问的区块更大。
因此,Spark 使用这种数据块访问顺序来确定 .RAD 文件数据块获取的优先级。它会根据摄像头视角不断重新计算优先级最高的数据块,并使用 3 个并行的 Web Worker 在后台获取和解码数据。
虚拟内存
虚拟内存是一种内存管理技术,它通过固定大小的真实“物理内存”池提供对大量理想化“虚拟内存”的访问。页表用于在虚拟内存和物理内存之间建立映射关系,每个页的大小都是固定的。
Spark 2.0 将此技术应用于 3DGS,在 GPU 上分配一个固定的 1600 万个 splat 池,并自动管理 64000 个 splat GPU“页”与 64000 个 .RAD 文件虚拟块之间的映射。块根据 LoD 遍历顺序加载到空页中。当页表已满且块的优先级低于需要获取的新块时,块会按照最近最少使用 ( LRU) 的方式被移除。

点击体验 3D: 3DGS 数据被组织成 64K 个 splat 的块/页,根据相机视角需要加载到统一的 GPU 页表中,并以 LRU 方式与其他数据交换。https://wlt-ai-cdn.art/spark-2.0/260413/page-table.html
Spark 的设计允许同时获取多个 .RAD 文件并共享同一个页表。对于每个 .RAD 文件,我们存储其从数据块到页表的映射关系,以及从页表到文件和数据块的反向映射关系。在遍历多个 LoD splat 树时,我们会跟踪数据块和文件的访问顺序。最终,我们会得到一个跨所有文件和数据块的全局优先级排序,从而优化场景中所有 3DGS 对象 splat 的获取和存储。
概括
Spark 是一款适用于 THREE.js 和 WebGL2 的 3DGS 渲染器,它拥有用户可编程的 GPU splat 处理引擎。全新的 Spark 2.0 版本新增了 3DGS 细节层次系统,能够持续调整细节级别,根据用户的视线方向渲染 splat 细节。全新的 3DGS 文件格式 .RAD 支持渐进式细化流式渲染,而虚拟 splat 分页系统则允许在固定 GPU 内存分配下访问无限的 splat 世界。
探索 Spark 2.0 的创作
星速——詹姆斯·凯恩著
《星际速度》(Starspeed)是一款多人太空飞船射击游戏,拥有由荣获威比奖的艺术家兼开发者詹姆斯·C·凯恩创作的10首合成波风格的配乐和引人入胜的故事情节。该游戏使用World Labs的Marble和Spark.js,以及Blender和three.js制作而成,通过.rad格式直接在浏览器中传输由超过1亿个高斯粒子组成的公里级科幻环境。

点击播放: 詹姆斯·凯恩的《星速》https://starspeed.game/
休眠的记忆 — Hugues Bruyère 着
《沉睡的记忆》是休斯·布鲁耶尔(Hugues Bruyère)创作的一系列互动扫描作品。布鲁耶尔是Dpt.创意工作室的联合创始人兼首席技术官,该工作室专注于互动和沉浸式体验。作品捕捉现实世界中的地点,并用大理石(Marble)构建出可探索的环境,将记录的空间与想象的空间连接起来,探索氛围、记忆以及场所的另一种版本。

点击体验: Hugues Bruyère 的休眠记忆 https://smallfly.com/dormant_memories/
探索巨大的空间——藤原龙
Hololive空间信息技术部的藤原龙展示了大规模3D高斯泼溅技术,该技术利用多个场景捕捉数据,最多可生成4000万个泼溅点。该体验在智能手机上流畅运行,并且兼容Quest和Vision Pro。

点击体验: 探索藤原龙的巨型空间捕捉作品 https://works.lilea.net/spark/
3DGS + 你?
如果您觉得这篇文章有趣,请访问我们的GitHub 代码库。克隆代码库并测试Spark 示例。在Spark 文档中了解更多关于 Spark 及其功能的信息。了解如何开始使用新的 LoD 系统。
需要为您的项目准备 3DGS 数据吗?试试 World Labs Marble,只需一行文本或一张图片即可创建 3DGS 世界。使用Marble Studio将您的作品连接成庞大的虚拟世界。使用 Spark LoD 制作一个渲染您世界的 3D Web 应用,并与您的所有朋友分享!
如果您是编程或图形设计新手,现代的LLM(语言学习模型)现在能够仅凭几行英文文本就生成完整的THREE.js游戏。借助Spark和Marble,任何人都可以为Web创建3D体验!
Spark 旨在拓展 3DGS 的应用范围。如果您觉得 Spark 及其 LoD 系统的技术细节很有用,它是开源的,您可以基于其代码和理念进行开发。本文中的每个 3D 示例都是一个包含链接 3D 资源的单页 HTML 文件。您可以在浏览器中查看源代码并根据需要进行编辑!
最后,如果您觉得这篇文章很有趣,并且对World Labs 的愿景感到兴奋,那就加入我们吧!
更多细节内容可加V沟通

原文( https://www.worldlabs.ai/blog/spark-2.0 )
https://www.worldlabs.ai/blog/spark-2.0
夜雨聆风