拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Brush:基于 Rust 与 WGSL 的跨平台 3D 高斯泼溅(Gaussian Splatting)渲染与训练引擎实战指南

人工智能深度学习NLP计算机视觉强化学习【免费下载链接】google-researchGoogle Research项目地址https://gitcode.com/gh_mirrors/go/google-research点击查看免费下载导读Brush 是 Google Research 仓库中的一个 3D 重建引擎项目以高斯泼溅Gaussian Splatting为核心算法目标是在保持高度可移植性的同时实现快速渲染与训练同一套代码可运行于 macOS、Windows、Linux 桌面、浏览器WebAssembly以及 Android 等平台。它基于 Rust 生态的深度学习框架 Burn 与自定义 WGSL 计算着色器实现默认应用使用 egui 构建界面。阅读本文后你将掌握 Brush 的完整上手流程从.ply预训练模型可视化到 zip 数据集训练、跨平台构建方法、核心渲染管线的源码级原理以及训练超参数TrainConfig的详细含义与调优方向。项目概述一个可移植、可训练、可实时可视化的高斯泼溅引擎Brush 的核心定位见 brush_splat/README.md是渲染与训练一体既可以加载预训练的高斯泼溅.ply文件进行可视化也可以从多种数据集COLMAP、synthetic NeRF直接训练跨平台桌面端macOS/Windows/Linux、浏览器通过 trunk WebGPU、Android 均可运行iOS 理论上可行但尚未配置工程技术栈底层计算内核使用 WGSL 编写通过 naga_oil 管理 shader 导入深度学习与自动微分部分依托 Burn 框架界面采用 eguieframe。需要说明的是该项目定位是proof of concept概念验证目前只实现标准高斯泼溅算法的基本训练并未涵盖近年来出现的各种扩展如 Mip-Splatting、2DGS、SparseGS 等README 中对此有明确声明。快速上手从安装到运行环境要求与构建Brush 是一个 Cargo workspacebrush_splat/Cargo.toml默认成员为crates/brush-desktop。构建只需 Rust 1.78# 在 brush_splat 目录下 cargo run # 调试模式运行桌面应用 cargo run --release # 发布模式推荐性能显著更好 cargo test --all # 运行全部测试启用 rerun 实时可视化需要先按官方指引安装 rerun viewercargo run --featuresrerun使用 tracy 性能剖析器cargo run --release --featuretracy启用 tracy 后界面会多出一些选项用于同步 GPU从而大致测量 GPU 耗时。从 workspace 配置brush_splat/Cargo.toml可以看到关键依赖版本与来源wgpu 22.1.0、naga 22.1.0、naga_oil 0.15burn及其burn-jit、burn-wgpu均以 git 依赖方式引入开启wgpu、autodiff、template、std等 feature特别地仓库通过[patch.crates-io]将wgpu/naga覆盖为作者维护的flt-atom分支支持 float atomics见后文 WebGPU 兼容性讨论egui/eframe0.28 也以 git patch 方式锁定版本以保持与 rerun 的兼容。启动后的两种使用方式cargo run启动桌面应用后入口见 crates/brush-desktop/src/main.rs窗口默认 1280×720通过文件选择器加载以下两类文件crates/brush-viewer/src/viewer.rs.ply文件加载预训练高斯泼溅模型进入纯可视化模式可轨道旋转观察、调节渲染选项.zip数据集进入训练模式边训练边实时观看重建效果。源码中process_loop明确只接受.ply与.zip两种扩展名其他文件会报错Only .ply and .zip files are supported.。PLY 导入逻辑位于 crates/brush-viewer/src/splat_import.rs支持标准高斯泼溅 PLY 属性x/y/z中心位置、scale_0..2对数尺度、rot_0..3四元数旋转、opacity、f_dc_0..2与f_rest_*球谐系数。值得注意的是PLY 中存储的 opacity 与 scale 是经 sigmoid/exp 激活后的值导入时会通过inv_sigmoid反变换回原始参数空间(v / (1.0 - v)).ln()以匹配训练时的参数表示。数据集准备两种 zip 格式训练数据必须打包为一个.zip文件数据集解析入口见 crates/brush-dataset/src/lib.rs 的read_dataset内部先尝试 synthetic NeRF 解析失败后回退到 COLMAP 解析Synthetic NeRF 格式包含transform_train.json相机位姿/内参与训练图像实现见 crates/brush-dataset/src/nerf_synthetic.rs。典型示例即论文 Blender 数据集Chair、Lego、Ship 等COLMAP 格式将包含images与sparse两个子文件夹的目录直接打包为 zip实现见 crates/brush-dataset/src/colmap.rs 与colmap_read_model.rs。加载时两个可选限制参数由 Viewer 透传crates/brush-viewer/src/viewer.rsmax_frames限制使用的帧数默认取全部target_resolution目标分辨率上限超过该边长的图像会被等比例缩小使用 Lanczos3 滤波器见 crates/brush-dataset/src/lib.rs 的clamp_img_to_max_size可显著加快训练并降低显存占用。若想快速体验README 提供了取自 mipnerf360 与原始高斯泼溅论文的参考数据多个.ply模型文件如 bicycle、garden、room 等以及 synthetic NeRF 训练数据具体下载链接请查阅 brush_splat/README.md 的 Example data 一节。跨平台构建Web 与 AndroidWeb浏览器项目使用trunk构建 Web 版本。在crates/brush-desktop目录下# 安装 trunk若尚未安装 cargo install trunk # 启动开发服务器 trunk serveWeb 端配置见 crates/brush-desktop/Trunk.toml 与 crates/brush-desktop/index.html。由于 WASM 下线程不可用实时训练在浏览器中以独立的 async 任务运行而非线程brush_splat/README.md Live training 一节渲染循环中还会主动yield给浏览器以避免卡顿crates/brush-viewer/src/viewer.rs。入口代码中针对wasm32分支通过eframe::WebRunner挂载到main_canvas元素上。Android完整的 Android 构建流程记录在 crates/brush-android/README.md# 前置安装 Android SDK NDK一次性的环境配置 export ANDROID_NDK_HOMEpath/to/ndk export ANDROID_HOMEpath/to/sdk rustup target add aarch64-linux-android cargo install cargo-ndk # 每次修改 Rust 代码后重新编译注意Android 构建配置与 Rust 编译相互独立 cargo ndk -t arm64-v8a -o app/src/main/jniLibs/ build # 追求性能请使用 release cargo ndk -t arm64-v8a -o app/src/main/jniLibs/ build --release # 命令行构建与安装或直接使用 Android Studio但 Android Studio 不会自动编译 Rust 代码 ./gradlew build ./gradlew installDebug adb shell am start -n com.splats.app/.MainActivityiOSREADME 指出 iOS理论可行但尚未配置工程、也未测试属于未验证状态不建议直接在生产场景依赖。架构解析Crate 结构与职责划分Brush 将功能拆分为多个 cratebrush_splat/Cargo.toml 的members [crates/*]职责清晰Crate职责brush-render主渲染 crate把各 WGSL 内核组装为可微分的渲染函数是前向渲染与反向梯度计算的核心brush-train训练逻辑高斯优化、大规模增密/剪枝split/clone/prune等brush-vieweregui 界面与训练循环集成轨道相机、PLY 导入、训练状态展示brush-desktop桌面/Web 二进制目标cargo run的默认入口brush-androidAndroid 二进制目标brush-wgslWGSL 内核反射工具生成 CPU 侧 Rust 结构体并与 naga_oil 交互管理 shader 导入brush-kernel共享的 shader 生成宏kernel_source_gen!与张量工具brush-dataset数据集导入COLMAP 与 synthetic NeRF 解析brush-prefix-sum、brush-sort纯计算内核前缀和与基数排序除brush-wgsl外与 Brush 业务几乎解耦rrfdrfd原生文件选择对话框的扩展用于跨平台文件选择sync-span同步追踪跨度工具其中brush-prefix-sum与brush-sort的独立性意味着它们可以被复用为通用 GPU 计算组件README 对此有明确说明。实时训练训练与渲染并行Brush 支持在另一个线程Web 端为异步任务上持续执行训练同时主界面线程渲染当前高斯结果——因此你能实时观察训练动力学高斯从随机初始化逐渐生长、分裂、收敛为场景。这在采集数据时也可作为即时预览工具。训练循环的关键流程见 crates/brush-viewer/src/viewer.rsSplats::AutodiffBackend::init_random(config.init_splat_count, 2.0, device)随机初始化指定数量的高斯默认 1000 个尺度初始 2.0构建SceneLoaderbatch size 1与SplatTrainer循环调用trainer.step(batch, splats)执行一个训练步前向渲染 → 损失 → 反向 → 优化器更新 → 增密/剪枝每 5 个 iter 通过 channel 向 UI 发送一次TrainStep消息包含最新的高斯与 lossUI 据此刷新画面训练循环与渲染通过共享的 wgpu device 协作当前尚不支持多设备训练。渲染管线源码剖析从投影到光栅化前向渲染的完整阶段brush-render的渲染函数定义在 crates/brush-render/src/render.rs入口为render_forward对用户暴露的可微分接口为render_splats其 trait 定义见 crates/brush-render/src/lib.rs。整体流程如下投影ProjectSplats将每个高斯means/log_scales/quats/sh_coeffs/raw_opacities投影到屏幕空间计算深度输出 global gid ↔ presort gid 映射与深度值深度排序DepthSort使用brush-sort的 GPU 基数排序radix_argsort32 bit按深度排序得到global_from_compact_gid映射可见性投影ProjectVisible只对可见高斯计算投影后的椭圆ProjectedSplat中心 xy、锥体 conic 参数、颜色 RGBA、半径等并统计每个 splat 命中的 tile 数num_tiles_hit前缀和PrefixSum对 tile 命中数做前缀和得到cum_tiles_hit从而算出总交点数量num_intersections每个高斯-瓦片交叠为一个 intersection映射交点MapGaussiansToIntersect将每个交点映射到其所属高斯与 tile按 tile 排序Tile sort复用基数排序按 tile ID 排序且利用已知的 tile 数量上限跳过前导 0 位bits u32::BITS - num_tiles.leading_zeros()比完整 32 bit 排序更快瓦片边界GetTileBinEdges计算每个 tile 的交点区间tile_bins的 [min,max) 边界供光栅化时快速定位光栅化Rasterize按 tile 并行混合所有交点的颜色与透明度输出 RGBA 图像或按raster_u32选项输出压缩为 u32 的 RGBA8 buffer用于即时显示同时记录每个像素最后可见的高斯final_index供反向传播使用。稀疏计算风格README 强调内核采用sparse 风格只对可见高斯通过视锥剔除、depth 排序后靠前的高斯执行实际计算避免了传统逐像素遍历全部高斯的开销不过最终梯度是稠密的dense——反向时使用原子累加将梯度散布到对应高斯参数上。两段式排序的优化Brush 的排序策略受 FidelityFX 启发GPU 基数排序实现位于 crates/brush-sort/src。与一次性按 (tile, depth) 复合键排序不同Brush将排序拆成两段先按深度排序再按 tile ID 排序。由于第二步排序时 key 的上界已知tile 总数可以跳过大量高位比特从而节省排序时间。反向传播WebGPU 约束下的梯度计算反向实现位于 crates/brush-render/src/render.rsRenderBackwards由三个内核协作RasterizeBackwards按 tile 反向混合将图像梯度散射到v_xys_local、v_conics、v_colors等局部梯度 bufferGatherGrads把按可见 splat 紧凑存储的梯度重新聚合并散布到全局高斯索引上得到球谐系数梯度、不透明度梯度与屏幕空间 xy 梯度ProjectBackwards从 xy/conic 梯度反推均值、log 尺度、四元数的梯度。README 声明这些梯度已在简单案例下与参考实现逐项核对一致仓库中的test_reference测试crates/brush-render/src/render.rs正是通过加载test_cases/下的.safetensors参考数据tiny_case / basic_case / mix_case由NerfStudioRefGen.ipynb生成对 xys、conics、渲染图像以及 v_means、v_scales、v_quats、v_opacities、v_coeffs 全部梯度做all_close精度断言容差约 1e-5~1e-6图像由于 gSplat 使用半精度混合容差放宽到 1e-4。训练引擎TrainConfig 超参数全解训练逻辑集中在 crates/brush-train/src/train.rs核心是SplatTrainer。其配置结构TrainConfig各字段含默认值如下字段默认值含义lr_meanmin/max3e-3 / 3e-3高斯中心位置means的学习率区间lr_opacmin/max3e-3 / 3e-3不透明度opacity的学习率区间lr_restmin/max3e-3 / 3e-3其余参数球谐系数/四元数/log 尺度的学习率区间schedule_steps5000线性学习率衰减总步数seed42随机种子warmup_steps200热身步数在此之前不进行增密/剪枝refine_every100每隔多少步执行一次剪枝与增密ssim_weight0.0SSIM 损失的权重0 表示只用 L1/Huber在 crates/brush-train/src/ssim.rs 实现prune_alpha_thresh0.05不透明度低于该阈值的高斯被剔除调低如 0.005 可换取更高质量prune_scale_thresh0.005尺度低于该阈值的高斯被剔除clone_split_grad_threshold0.0001累积屏幕空间梯度超过该阈值时触发克隆或分裂split_clone_size_threshold0.01小于该尺度阈值的高斯选择克隆clone大于则选择分裂splitcull_scale_thresh0.5世界单位下尺度过大的高斯被剔除reset_alpha_every30每隔refine_every × reset_alpha_every步重置一次不透明度避免局部最优random_bck_colorfalse是否随机背景色训练visualize_every100rerun 可视化训练统计的频率visualize_splats_every250rerun 可视化高斯的频率init_splat_count1000随机初始化高斯数量训练循环的实现细节SplatTrainer::stepcrates/brush-train/src/train.rs的关键机制损失函数默认使用 delta0.05 的 Huber 损失HuberLossConfig::new(0.05)若ssim_weight 0则组合loss * (1-w) (1-ssim) * w三组独立学习率Burn 原生不易为同一模块的不同参数设置不同 LRBrush 的做法是把梯度按参数组拆分为三份GradientsParams对SplatTrainer内部的Adamepsilon1e-15分别调用三次optim.stepmean 一组、opacity 一组、其余一组每组配一个独立的线性 LR 调度器实时学习率参考桌面端训练默认配置crates/brush-viewer/src/viewer.rs为lr_mean4e-5→2e-5、lr_opac8e-2→2e-2、lr_rest2e-2→1e-2增密与剪枝densify_and_prune每refine_every步执行——先按 alpha 阈值与 scale 阈值剪除高斯预热结束后再按累计屏幕空间梯度决定克隆/分裂小尺度高梯度 → 克隆大尺度高梯度 → 分裂分裂时沿旋转后的尺度方向施加正态扰动生成两个新高斯尺度除以 1.6最后通过reset_opacity周期性重置不透明度并重建优化器状态梯度统计xy_grad_norm_accum以max而非原论文的滑动平均方式累计每个高斯的屏幕空间 xy 梯度模长用于指导增密代码注释中也坦承这可能与参考实现有差异、值得消融验证Housekeeping每步对四元数做归一化norm_rotations保证旋转参数合法。训练超参数的意义三组学习率的设计对应高斯参数的不同敏感度opacity 需要较大学习率快速收敛透明度means 需要较小的学习率精细调整位置。线性调度LinearLrScheduler从 max_lr 衰减到 min_lrschedule_steps决定衰减周期。prune_alpha_thresh、clone_split_grad_threshold、cull_scale_thresh三者共同控制高斯数量的动态平衡剪掉透明/过大的高斯克隆不足的小高斯分裂过大的高斯——这正是高斯泼溅训练中自适应密度控制的核心。性能、基准与测试渲染性能README 表示渲染性能预期与 gsplat 相当训练性能会略慢更详细的基准数据即将补充。仓库中已包含渲染基准测试 crates/brush-render/benches/render_bench.rs共享内存光栅化参考实现依赖共享内存做光栅化Brush 曾经也如此但在 M1 上实测更慢因此当前默认关闭作者计划后续在桌面 GPU 上重新启用测试体系cargo test --all覆盖渲染冒烟测试renders_at_all用零尺寸高斯验证背景色输出正确与梯度参考对比测试test_reference见前文。技术细节与 WebGPU 兼容性挑战WebGPU 的约束是 Brush 诸多设计决策的根源详见 brush_splat/README.md Kernels 一节缺少原生 float 原子加法反向光栅化时无法原子累加 float 梯度因此改为先把梯度散射到独立 buffer再用GatherGrads内核统一聚合SHADER_FLT32_ATOMICcapability 在 crates/brush-render/src/shaders/mod.rs 中声明缺少 subgroup 操作wgpu 在原生平台已支持 subgroup未来整合可获得可观加速GPU readback 困难WebGPU 下渲染 pass 内无法同步读回数据。参考实现的 tile renderer 需要读回交点数量这不可行Brush 的解决方案是按最坏情况假设分配最大交点 buffermax_intersects min(num_points * num_tiles, 128 * 65535)见 crates/brush-render/src/render.rs同时光栅化器通过将高斯椭圆与屏幕 tile 求交剔除来削减多余交点。另外brush-wgsl通过反射自动生成 CPU 侧 uniform/结构体 Rust 代码可参考 crates/brush-render/src/shaders/mod.rs 中自动生成的RenderUniforms、ProjectedSplat、ShCoeffs等#[repr(C)]结构体brush-kernel的kernel_source_gen!宏则负责把.wgsl源文件封装为可调度的内核任务crates/brush-render/src/kernels.rs。未来可能将内核移植到 Burn 的 CubeCL 系统以简化这一流程并获得 CUDA 兼容性。结语Brush 用 Rust 重新诠释了经典 3D 高斯泼溅算法Burn 提供自动微分与优化器自定义 WGSL 内核负责可微分的投影-排序-光栅化管线wgpu 抹平了从桌面到浏览器的设备差异。虽然它仍处于概念验证阶段、功能聚焦于标准算法但其**稀疏计算 两段式基数排序 WebGPU 兼容性绕行方案**的实现思路对理解高斯泼溅底层工程以及 WebGPU 计算编程都有很高的参考价值。若要深入建议从 crates/brush-render/src/render.rs 的渲染管线与 crates/brush-train/src/train.rs 的训练循环两个文件入手配合cargo test --all验证环境再逐步替换TrainConfig参数观察训练效果。免责声明本项目并非 Google 官方产品见 brush_splat/README.md Disclaimer本文基于仓库内文档与源码撰写。赞分享人工智能深度学习NLP计算机视觉强化学习【免费下载链接】google-researchGoogle Research项目地址https://gitcode.com/gh_mirrors/go/google-research点击查看免费下载相关推荐Brush 3D高斯泼溅技术跨平台实时渲染的完整实战指南在当今快速发展的3D图形领域传统渲染技术面临着性能瓶颈和硬件依赖的挑战。Brush项目以其创新的高斯泼溅算法为3D重建和实时渲染带来了革命性突破。这项技术不计算机视觉图形学深度学习Make Me a Hanzi9000 汉字的笔画动画与结构数据你的学习应用离它只差一次 cloneMake Me a Hanzi9000 汉字的笔画动画与结构数据你的学习应用离它只差一次 clone 你半夜想给娃做一个练字 App然后卡住了 假设你是数据集教育3D渲染引擎实战指南基于gsplat的实时高斯泼溅技术应用3D渲染引擎实战指南基于gsplat的实时高斯泼溅技术应用 3D高斯泼溅渲染技术是近年来计算机图形学领域的重大突破它通过将场景表示为 millions 级别人工智能计算机视觉3D渲染图形学高性能计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门