volrend Web部署指南:用emscripten构建WASM版浏览器NeRF查看器的完整流程
【免费下载链接】volrendPlenOctree Volume Rendering (supports CUDA & fragment shader backends)项目地址: https://gitcode.com/gh_mirrors/vo/volrend
volrend 是一个实时 PlenOctree 体渲染器,用 C++ 和 OpenGL 编写,可实时渲染 NeRF(神经辐射场)场景。借助 emscripten 工具链,volrend 能把整个渲染引擎编译成 WebAssembly(WASM),让你在浏览器里直接运行 NeRF 查看器,无需安装任何软件。本文将带你完成 volrend Web 版从环境安装、CMake 构建、本地预览到上线部署的完整流程。
🎯 volrend 的 Web 版能做什么
volrend 官方 Web 版使用片元着色器后端(而非 CUDA 后端)构建,核心能力包括:
- 交互式 NeRF 查看:鼠标/触屏旋转、平移、缩放,实时查看 PlenOctree 场景
- 远程数据加载:通过 emscripten fetch API 在线拉取压缩后的
.npz八叉树文件 - 本地文件打开:支持在浏览器里加载本地的
.npz树文件、.obj网格和 drawlist 文件 - 丰富的可视化选项:切片渲染(Slicing)、SH 分解、伪重光照、八叉树网格、FPS 统计等
桌面版的渲染效果可以参考下图(乐高场景的体渲染切片视图,Web 版交互能力相同):
🛠️ 第一步:准备 emscripten 构建环境
Web 版构建依赖 emscripten 官方文档 所述的标准安装方式,你需要:
- 安装 emscripten 官方文档 所述的 SDK(推荐用
emsdk一键安装) - 确保系统中有CMake(3.3+)和Python 3(构建脚本会用到)
- 克隆项目(含子模块):
git clone https://gitcode.com/gh_mirrors/vo/volrend volrend cd volrend💡 关键点:volrend 的
CMakeLists.txt内置了完整的 emscripten 分支逻辑——只要检测到 EMSCRIPTEN 编译器,就会自动关闭 CUDA、切换为片元着色器后端,并把着色器shaders/rt.frag内联进代码,无需任何手动修改。
🚀 第二步:用 emcmake 三步构建 WASM 版
volrend 的构建脚本把网页所需的 HTML/CSS/JS/WASM 全部自动化了,构建只有三步:
mkdir embuild && cd embuild emcmake cmake .. make -j12构建完成后,完整的网站会写到embuild/build/目录,结构如下:
build/index.html—— 页面入口,自动注入版本号build/js/main.js—— 由 5 个 JS 文件 + WASM 胶水代码自动拼接而成build/js/volrend_web.wasm—— 真正的 WASM 渲染引擎build/css/main.css—— 页面样式
这套自动化来自CMakeLists.txt中的 emscripten 分支(约第 284–356 行),它配置了关键编译参数:USE_WEBGL2=1(启用 WebGL2)、USE_GLFW=3(用 GLFW 模拟浏览器窗口)、ALLOW_MEMORY_GROWTH=1(内存可增长,初始 512MB)。构建时还会自动执行web/autoversion.py给 JS/CSS 加上随机版本号,解决浏览器缓存问题。
🖥️ 第三步:本地启动预览
volrend 内置了一个serve构建目标,直接调用 Python 的 HTTP 服务器预览:
cd embuild make serve然后在浏览器打开http://0.0.0.0:8000/即可看到 PlenOctree Viewer 界面。
页面前端逻辑位于web/目录:
web/index.html—— 导航栏、选项面板、图层面板、加载进度条web/js/init.js—— 鼠标/触屏/键盘事件桥接,把输入转发给 WASM 端web/js/emModule.js—— emscripten 运行时配置与进度回调web/js/guiComponents.js—— 选项滑块、图层 UIweb/main_web.cpp—— C++ 侧的 Web 入口,负责 OpenGL 初始化、数据加载与 JS 绑定
📂 加载场景:远程 URL 与本地文件两种方式
方式一:URL 参数自动加载。web/js/init.js支持在地址栏追加参数,页面启动后自动下载并渲染:
index.html?load=scene.npz多个文件用;分隔,如?load=tree.npz;camera.draw.npz。加载器会按扩展名自动判断:.obj走网格加载、.draw.npz走 drawlist、其余按八叉树处理(见web/main_web.cpp中的load_remote函数)。
方式二:Load Local 手动加载。点击导航栏的Open Local按钮,选择本地.npz或.obj文件。JS 会把文件读入 emscripten 的虚拟文件系统(MEMFS),再交给 C++ 端解析——这也是CMakeLists.txt里FORCE_FILESYSTEM=1参数的用途。
⚙️ 使用指南:常用交互与选项
进入页面后,常用操作如下:
| 操作 | 说明 |
|---|---|
| 鼠标左键拖动 | 绕相机位置旋转视角 |
| 鼠标右键拖动 | 绕原点旋转 |
| 滚轮 / 双指捏合 | 前后移动 / 触屏缩放 |
1–6键 | 切换 world_up 方向,适配不同坐标系的数据 |
T键 | 开关 FPS 计数 |
| Options面板 | 渲染质量(high speed / moderate / high quality)、切片包围盒、SH 分解范围、伪重光照、八叉树网格显示 |
| Layers面板 | 显示/隐藏相机层、网格层 |
🌐 第四步:部署到静态服务器
由于build/目录是完全自包含的静态资源,部署非常简单:
- 把整个
embuild/build/目录上传到任意静态托管(Nginx、Apache、GitHub Pages 风格的静态服务器均可) - 确保服务器允许跨域加载
.wasm(多数现代服务器默认支持) - 把场景
.npz文件放在同域下(或确保允许跨域访问),即可通过?load=xxx.npz分享链接
⚠️提示:WebGL2 渲染对浏览器 GPU 有要求,建议在带独立显卡的电脑上体验完整效果。
📦 进阶:压缩你的数据再上线
浏览器加载数据对体积敏感,volrend 提供了压缩脚本scripts/compress_octree.py,通过中值切割量化(svox 库)+ deflate 把原始.npz压缩到 Web 可用的体积:
pip install svox python scripts/compress_octree.py scene.npz --out_dir webdata --retain 4--retain 4表示保留前 4 个 SH 系数不量化,部分场景需要此参数保证质量。压缩后的文件仍可直接被 volrend 打开,把它放进部署目录即可被 Web 查看器加载。
❓ 常见问题
Q1:构建时报 "A submodule has not downloaded!" 怎么办?执行git submodule update --init --recursive后再重新构建。GLFW 等第三方库以子模块形式包含在3rdparty/目录中。
Q2:Web 版和桌面版功能有差异吗?有。Web 版基于片元着色器后端,比 CUDA 后端慢一些,且不支持网格插入相关功能(如 lumisphere probe 探针)。
Q3:页面打开后一直转圈?先检查浏览器是否支持 WebGL2;再看控制台是否有.wasm或.npz的 404 错误——静态服务器必须正确提供build/下所有文件。
✅ 小结
回顾 volrend Web 部署的核心路径:
- 安装 emscripten SDK
emcmake cmake .. && make -j12一键产出静态网站make serve本地预览- 把
build/目录扔到任何静态服务器 - 用
?load=xxx.npz参数或 Load Local 加载场景
整个过程不到 10 分钟,你就能拥有一个免安装的浏览器 NeRF 查看器,把 volrend 的实时 PlenOctree 体渲染能力分享给任何人 🎉
【免费下载链接】volrendPlenOctree Volume Rendering (supports CUDA & fragment shader backends)项目地址: https://gitcode.com/gh_mirrors/vo/volrend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考